ordenar una lista de mapa

Tengo una variable de lista creada así:

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

En mi aplicación de Android, esta lista se llena.

solo un ejemplo:

 Map map1 = new HashMap(); map.put("name", "Josh"); ... Map map2 = new HashMap(); map.put("name", "Anna"); ... Map map3 = new HashMap(); map.put("name", "Bernie"); ... list.add(map1); list.add(map2); list.add(map3); 

Estoy usando la list para mostrar los resultados en un ListView extendiendo BaseAdapter e implementando los diversos métodos.

Mi problema: necesito ordenar la list en orden alfabético según el nombre de la clave del mapa

Pregunta: ¿Cuál es una forma simple de ordenar la list en orden alfabético según el nombre de la clave del mapa?

Parece que no puedo entender esto. Arrays.sort(strArray); cada nombre de cada Map en una matriz de String y lo Arrays.sort(strArray); ). Pero eso no conserva los otros datos en cada Map , así que no estoy muy seguro de cómo puedo conservar los otros valores asignados

El siguiente código funciona perfectamente

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

Pero sus mapas deberían ser instancias de una clase específica.

Debe implementar un Comparator> que básicamente extrae el valor de “nombre” de los dos mapas que ha pasado, y los compara.

Luego use Collections.sort(list, comparator) .

¿Estás seguro de que un Map es realmente el mejor tipo de elemento para tu lista? ¿Quizás debería tener otra clase que contenga un Map pero también un método getName() ?

 @Test public void testSortedMaps() { Map map1 = new HashMap(); map1.put("name", "Josh"); Map map2 = new HashMap(); map2.put("name", "Anna"); Map map3 = new HashMap(); map3.put("name", "Bernie"); List> mapList = new ArrayList>(); mapList.add(map1); mapList.add(map2); mapList.add(map3); Collections.sort(mapList, new Comparator>() { public int compare(final Map o1, final Map 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")); } 

Necesita crear un comparador. No estoy seguro de por qué cada valor necesita su propio mapa, pero aquí está cómo se vería el comparador:

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

Puedes verlo trabajando con tu ejemplo anterior con esto:

 public class MapSort { public List> testMap() { List> list = new ArrayList>(); Map myMap1 = new HashMap(); myMap1.put("name", "Josh"); Map myMap2 = new HashMap(); myMap2.put("name", "Anna"); Map myMap3 = new HashMap(); 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> testMap = ms.testMap(); System.out.println("Before Sort: " + testMap); Collections.sort(testMap, new ListMapComparator()); System.out.println("After Sort: " + testMap); } } 

Tendrás algunas advertencias seguras porque no me preocupé por ellas. Espero que ayude.

si quieres hacer uso de lamdas y hacerlo un poco más fácil de leer

  List> results; Comparator> sortByName = Comparator.comparing(x -> x.get("Name")); public void doSomething(){ results.sort(sortByName) } 

Poco fuera del tema
esto es una pequeña utilidad para mirar las preferencias compartidas
basado en respuestas superiores
puede ser para alguien esto será útil

 @SuppressWarnings("unused") public void printAll() { Map prefAll = PreferenceManager .getDefaultSharedPreferences(context).getAll(); if (prefAll == null) { return; } List> list = new ArrayList<>(); list.addAll(prefAll.entrySet()); Collections.sort(list, new Comparator>() { public int compare(final Map.Entry entry1, final Map.Entry entry2) { return entry1.getKey().compareTo(entry2.getKey()); } }); Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Timber.i("Printing all sharedPreferences"); for(Map.Entry entry : list) { Timber.i("%s: %s", entry.getKey(), entry.getValue()); } Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); } 
 try { java.util.Collections.sort(data, new Comparator>() { SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy"); public int compare(final Map map1, final Map 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) { }