2011-03-20 18 views
11

Necesito llamar a una API externa con una ArrayList de HashMaps que contiene varios pares clave-valor predefinidos cada uno. Un ejemplo:¿Cómo se clasifica una ArrayList de HashMaps que contiene varios pares clave-valor cada uno?

ArrayList<HashMap<String, String>> arrayListHashMap = new ArrayList<HashMap<String, String>>(); 

    { 
     HashMap hashMap = new HashMap<String, String>(); 
     hashMap.put("key", "A key"); 
     hashMap.put("value", "B value"); 
     arrayListHashMap.add(hashMap); 
    } 

    { 
     HashMap hashMap = new HashMap<String, String>(); 
     hashMap.put("key", "B key"); 
     hashMap.put("value", "A value"); 
     arrayListHashMap.add(hashMap); 
    } 

Ahora necesito ordenar esta construcción en el contenido de la tecla "valor". Este tipo daría como resultado la entrada "key = B key/value = A value" como la primera en el arrayListHashMap.

Cualquier ayuda es muy apreciada.

HJW

Respuesta

31

es necesario implementar un Comparator<HashMap<String, String>> o más generalmente Comparator<Map<String, String>> que acaba extrae el valor assocated con la tecla value, a continuación, utilizar Collections.sort. Código de la muestra (con la generalización de la tecla que desea ordenar en):

class MapComparator implements Comparator<Map<String, String>> 
{ 
    private final String key; 

    public MapComparator(String key) 
    { 
     this.key = key; 
    } 

    public int compare(Map<String, String> first, 
         Map<String, String> second) 
    { 
     // TODO: Null checking, both for maps and values 
     String firstValue = first.get(key); 
     String secondValue = second.get(key); 
     return firstValue.compareTo(secondValue); 
    } 
} 

... 
Collections.sort(arrayListHashMap, new MapComparator("value")); 
+0

Gracias mucho por su respuesta rápida. –

+0

Hola, ¿Qué ocurre si quiero ordenar algunos criterios personalizados? Como si tuviera un valor, diga TEST y deseo ordenar una lista de tal manera que todo el valor que sea TEST aparezca primero y luego todo lo demás. Entonces, básicamente, si tengo una lista de tamaño, digamos 10 y si contiene el valor de PRUEBA 2 veces en la posición 5 y 8, entonces quiero que ambos estén en la parte superior. Y otros valores serán después de eso ... ¿Puede decirme cómo hacerlo? – Scorpion

+0

@Scorpion: Luego escribe un comparador que comprueba TEST y siempre lo trata como antes que cualquier otro valor. ¿Qué parte de eso te resulta difícil? (Esto probablemente sea mejor como una nueva pregunta ...) –

0

(Esto no es una respuesta a la pregunta formulada - Jon ya ha hecho esto -, pero el campo de comentario es demasiado pequeño para esto).

Su estructura de datos parece que no entendió la estructura clave-valor de los mapas (y los mapas Hash en su ejemplo).

Un mapa puede contener cualquier número de claves, y para cada clave también un valor. Un par de clave y valor viene dado por Map.Entry (que se puede obtener mediante el método entrySet() del mapa). Si luego desea ordenar por clave, simplemente utilice un SortedMap (como TreeMap) en lugar del HashMap habitual.

Usted está emulando las entradas individuales por un HashMap cada uno, a continuación, poner a todos en un ArrayList ...: -/

Aquí lo que yo hubiera hecho en su ejemplo:

Map<String, String> map = new TreeMap<String, String>(); 
map.put("B key", "B value"); 
map.put("A key", "B value"); 

System.out.println(map); // already sorted 
+1

Gracias por su respuesta. Necesito alimentar la API externa, la idea no es mía. Lo que sí entiendo es que simulan algo así como un resultado de consulta de base de datos. ArrayList es el resultado de la consulta, cada HashMap es un registro y cada entrada es un nombre de campo y su valor. "clave" sería un campo y "valor" otro. Parece que debería haber usado nombres diferentes para las dos entradas en el ejemplo. Simplemente tome "campo1" y "campo2" en lugar de "clave" y "valor". Perdón por la confusion. –

+0

La API externa debería estar usando una lista de javabeans. – BalusC

Cuestiones relacionadas