Ordenar una lista de mapa <cadena, cadena>
Tengo una variable de lista creada así:
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
- RxAndroid debounce google maps en el cambio de cámara
- Android: capitalize no funciona
- Puntero de la cabeza FileOutputStream
- Cómo analizar con GSON cuando el identificador tiene espacio en el nombre
- Compruebe si la actividad se ha iniciado en el servicio
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
- ¿Puedo obtener propiedades definidas en "gradle.properties" en JAVA STATEMENT?
- Cortar la imagen después de seleccionar el área mediante la detección de bordes en android
- Descodificación de paquetes Airplay en Java o C / C ++ en Android
- Envío de una imagen de Matlab a una tableta Android
- OnClickListener no se puede resolver a un tipo (Eclipse)
- Cómo cambiar el color de texto de un elemento ListView?
- Accesibilidad de Android com.android.settings: id / left_button sobre la fuerza no funciona
- Cómo analizar JSON Array con Gson
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) { }
- Android personalizado RatingBar imagen de los artefactos
- Android: cómo cambiar el diseño en el botón de clic?