Ordenar una lista de mapa <cadena, cadena>

Tengo una variable de lista creada así:

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

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

Sólo un ejemplo:

 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); 

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

Mi problema: Necesito clasificar la list en orden alfabético basado en el nombre de clave del mapa

Pregunta: ¿Qué es una manera simple de ordenar la list en orden alfabético basado en el nombre de clave del mapa?

Parece que no puedo envolver mi cabeza alrededor de esto. He extraído cada nombre de cada Map en una matriz de la 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<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); 

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

 @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")); } 

Debe implementar un Comparator<Map<String, String>> que básicamente extrae el valor "name" de los dos mapas que ha pasado y los compara.

A continuación, utilice Collections.sort(list, comparator) .

¿Estás seguro de que un Map<String, String> es realmente el mejor tipo de elemento para tu lista sin embargo? Tal vez debería tener otra clase que contenga un Map<String, String> pero también tiene un método getName() ?

Necesitas crear un comparador. No estoy seguro de por qué cada valor necesita su propio mapa, pero aquí es lo que el comparador se vería así:

 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")); } } 

Puedes verlo trabajando con tu ejemplo anterior con esto:

 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); } } 

Tendrás algún tipo de advertencias seguras porque no me preocupé por ellas. Espero que ayude.

Poco fuera del tema
Esto es un poco util para ver las preferencias compartidas
Basado en respuestas superiores
Puede ser para alguien esto será útil

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

  • ¿Cómo comparte las variables con otras actividades fácilmente?
  • ProGuard para Android y GSON
  • Precisamente Sync Looped Audio con animación en Android
  • No se puede resolver el símbolo NameValuePair
  • Paginación de texto en Android
  • ¿Diferencia entre addOnLayoutChangeListener y onLayout (cambiado)?
  • Utilizar ColorMatrix o HexColor en BlendModeFilter - Android?
  • Android- Java.io.Exception: contenido Error de longitud Esperado x cantidad de memeory cantidad conseguida y
  • File.lastModified () nunca es lo que se estableció con file.setLastModified ()
  • Java: Subclase AsyncTask
  • ¿Qué tipo de efectos secundarios tiene libgdx numSamples?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.