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
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.
@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"));
}
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()
?
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é.
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)
}
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) {
}
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("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}