web-dev-qa-db-fra.com

tri d'une liste de cartes <chaîne, chaîne>

J'ai une variable de liste créée comme ceci:

List<Map<String, String>> list = new ArrayList<Map<String, String>>();

Dans mon Android, cette liste est remplie.

juste un exemple:

Map<String, String> map1 = new HashMap<String, String>();
map.put("name", "Josh");
...

Map<String, String> map2 = new HashMap<String, String>();
map.put("name", "Anna");
...

Map<String, String> map3 = new HashMap<String, String>();
map.put("name", "Bernie");
...

list.add(map1);
list.add(map2);
list.add(map3);

J'utilise list pour afficher les résultats dans un ListView en étendant BaseAdapter et en implémentant les différentes méthodes.

Mon problème: je dois trier list par ordre alphabétique en fonction de la clé de la carte nom

Question: Quel est un moyen simple de trier list par ordre alphabétique en fonction de la clé de la carte nom?

Je n'arrive pas à envelopper ma tête autour de ça. J'ai extrait chaque nom de chaque Map dans un tableau String, et je l'ai trié (Arrays.sort(strArray);). Mais cela ne préserve pas les autres données dans chaque Map, donc je ne sais pas trop comment je peux conserver les autres valeurs mappées

24
binnyb

Le code suivant fonctionne parfaitement

public Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() {
    public int compare(Map<String, String> m1, Map<String, String> m2) {
        return m1.get("name").compareTo(m2.get("name"));
    }
}

Collections.sort(list, mapComparator);

Mais vos cartes devraient probablement être des instances d'une classe spécifique.

37
JB Nizet
@Test
public void testSortedMaps() {
    Map<String, String> map1 = new HashMap<String, String>();
    map1.put("name", "Josh");

    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("name", "Anna");

    Map<String, String> map3 = new HashMap<String, String>();
    map3.put("name", "Bernie");

    List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();
    mapList.add(map1);
    mapList.add(map2);
    mapList.add(map3);

    Collections.sort(mapList, new Comparator<Map<String, String>>() {
        public int compare(final Map<String, String> o1, final Map<String, String> o2) {
            return o1.get("name").compareTo(o2.get("name"));
        }
    });

    Assert.assertEquals("Anna", mapList.get(0).get("name"));
    Assert.assertEquals("Bernie", mapList.get(1).get("name"));
    Assert.assertEquals("Josh", mapList.get(2).get("name"));

}
6
Paul McKenzie

Vous devez implémenter un Comparator<Map<String, String>> Qui extrait essentiellement la valeur "nom" des deux cartes qu'il a passées et les compare.

Utilisez ensuite Collections.sort(list, comparator).

Êtes-vous sûr qu'un Map<String, String> Est vraiment le meilleur type d'élément pour votre liste? Peut-être devriez-vous avoir une autre classe qui contient un Map<String, String> Mais a également une méthode getName()?

6
Jon Skeet

Vous devez créer un comparateur. Je ne sais pas pourquoi chaque valeur a besoin de sa propre carte, mais voici à quoi ressemblerait le comparateur:

class ListMapComparator implements Comparator {
    public int compare(Object obj1, Object obj2) {
         Map<String, String> test1 = (Map<String, String>) obj1;
         Map<String, String> test2 = (Map<String, String>) obj2;
         return test1.get("name").compareTo(test2.get("name"));
    }
}

Vous pouvez le voir fonctionner avec votre exemple ci-dessus avec ceci:

public class MapSort {
    public List<Map<String, String>> testMap() {
         List<Map<String, String>> list = new ArrayList<Map<String, String>>();
         Map<String, String> myMap1 = new HashMap<String, String>();
         myMap1.put("name", "Josh");
         Map<String, String> myMap2 = new HashMap<String, String>();
         myMap2.put("name", "Anna");

         Map<String, String> myMap3 = new HashMap<String, String>();
         myMap3.put("name", "Bernie");


         list.add(myMap1);
         list.add(myMap2);
         list.add(myMap3);

         return list;
    }

    public static void main(String[] args) {
         MapSort ms = new MapSort();
         List<Map<String, String>> testMap = ms.testMap();
         System.out.println("Before Sort: " + testMap);
         Collections.sort(testMap, new ListMapComparator());
         System.out.println("After Sort: " + testMap);
    }
}

Vous aurez certains types d'avertissements de sécurité, car je ne m'en suis pas inquiété. J'espère que ça t'as aidé.

4
blong824

si vous voulez utiliser des lambdas et les rendre un peu plus faciles à lire

  List<Map<String,String>> results;

  Comparator<Map<String,String>> sortByName = Comparator.comparing(x -> x.get("Name"));

  public void doSomething(){
    results.sort(sortByName)
  }
2
ALPHAB3TS00P
try {
        Java.util.Collections.sort(data,
                new Comparator<Map<String, String>>() {
                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "MM/dd/yyyy");

                    public int compare(final Map<String, String> map1,
                            final Map<String, String> map2) {
                        Date date1 = null, date2 = null;
                        try {
                            date1 = sdf.parse(map1.get("Date"));
                            date2 = sdf.parse(map2.get("Date"));
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        if (date1.compareTo(date2) > 0) {
                            return +1;
                        } else if (date1.compareTo(date2) == 0) {
                            return 0;
                        } else {
                            return -1;
                        }
                    }
                });

    } catch (Exception e) {

    }
0
ThmHarsh

Peu hors sujet
ceci est une petite utilité pour regarder les préférences partagées
basé sur les réponses supérieures
peut être pour quelqu'un, ce sera utile

@SuppressWarnings("unused")
public void printAll() {
    Map<String, ?> prefAll = PreferenceManager
        .getDefaultSharedPreferences(context).getAll();
    if (prefAll == null) {
        return;
    }
    List<Map.Entry<String, ?>> list = new ArrayList<>();
    list.addAll(prefAll.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<String, ?>>() {
        public int compare(final Map.Entry<String, ?> entry1, final Map.Entry<String, ?> entry2) {
            return entry1.getKey().compareTo(entry2.getKey());
        }
    });
    Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    Timber.i("Printing all sharedPreferences");
    for(Map.Entry<String, ?> entry : list) {
        Timber.i("%s: %s", entry.getKey(), entry.getValue());
    }
    Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
0
Vlad