Despues de un Post de un lector os dejo como ordenar un HashMap por Key y por Values:
//Ordenar un Map por Key
Map miMap= new HashMap();
miMap.put("2", "valor2");
miMap.put("1", "valor1");
miMap.put("4", "valor4");
miMap.put("3", "valor3");
Map mapOrdenado = new TreeMap(miMap);
Set ref = mapOrdenado.keySet();
Iterator it = ref.iterator();
while (it.hasNext()) {
System.out.println((String)it.next());
}
//Ordenar Map por Valor
HashMap mapResultado = new LinkedHashMap();
List misMapKeys = new ArrayList(miMap.keySet());
List misMapValues = new ArrayList(miMap.values());
TreeSet conjuntoOrdenado = new TreeSet(misMapValues);
Object[] arrayOrdenado = conjuntoOrdenado.toArray();
int size = arrayOrdenado.length;
for (int i=0; i<size; i++) {
mapResultado.put
(misMapKeys.get(
misMapValues.indexOf(
arrayOrdenado[i])
),arrayOrdenado[i]);
}
Iterator it1 = mapResultado.values().iterator();
while (it1.hasNext()) {
System.out.println((String)it1.next());
}
Espero que os sirva.
7 comentarios:
te mastaste haciendo ese ordenamiento!! gracias sirve de mucho
Pos ordena bien y todo en el caso que se tengan claves unicas y no repetidas al igual que los valores .. pero si yo quisiera guardar el oreden en que fueron ingresados mis keys .. hace tiempo hice una rutina que me ordenaba los valores sin importar que hubiesen claves repetidas ..
public static LinkedHashMap orderForKeys(LinkedHashMap map)
{
LinkedHashMap newMap = new LinkedHashMap();
ArrayList values = new ArrayList(map.keySet());
Collections.sort(values);
Iterator it = values.iterator();
double tmp=0;
while(it.hasNext())
{
tmp = it.next();
for(Map.Entry k : map.entrySet())
{
if(tmp==k.getKey())
{newMap.put(k.getKey(), k.getValue());}
}
}
return newMap;
}
y , en . esta oredena por . valores
public static LinkedHashMap orderForValues(LinkedHashMap map)
{
LinkedHashMap newMap = new LinkedHashMap();
ArrayList values = new ArrayList(map.values());
Collections.sort(values);
Iterator it = values.iterator();
double tmp=0;
while(it.hasNext())
{
tmp = it.next();
for(Map.Entry k : map.entrySet())
{
if(tmp==k.getValue())
{newMap.put(k.getKey(), k.getValue());}
}
}
return newMap;
}
permitiendo valores repetidos e las claves .
De lujo, es el primer post con una solucion sencilla y corta que encuentro, ahora lo que yo necesitaba era leer de forma ordenada un HashMap y lo hice asi siguiendo tu codigo:
HashMap h=new HashMap ();
h.put(3, "Enrique");
h.put(6, "Quito");
h.put(4, "Rocha");
h.put(5, "Ramirez");
h.put(2, "Luis");
MapmapOrdenado = new TreeMap(h);
Set ref = mapOrdenado.keySet();
for (int i:ref) System.out.println(h.get(i));
Y me funciono de lujo, muchas gracias, genial tu aporte!
Genial el Algoritmo de ordenación. Gracias por el aporte.
//Mapa a ordenar LinkedHashMap mapaDatos= new LinkedHashMap();
//Datos de prueba
mapaDatos.put("4", "Cuatro");
mapaDatos.put("2", "Dos");
mapaDatos.put("9", "Nueve");
mapaDatos.put("1", "Uno");
//Proceso de ordenamiento de llaves
ArrayList llavesOrdenadas = new ArrayList(mapaDatos.keySet());
Collections.sort(llavesOrdenadas);
//Fin de proceso de ordenamiento
//Test de resultado.
for (String llave : llavesOrdenadas) {
System.out.println(llave + " - "+mapaDatos.get(llave));
}
//Salida del test copiado de //consola.
//1 - Uno
//2 - Dos
//4 - Cuatro
//9 - Nueve
//Cometi un error al pegar la //definición del mapa. la correcta //es:
LinkedHashMap mapaDatos= new LinkedHashMap();
//El algoritmo de ordenamiento en //en si es:
LinkedHashMap mapaDatos= new LinkedHashMap();
ArrayList llavesOrdenadas = new ArrayList(mapaDatos.keySet());
Collections.sort(llavesOrdenadas);
Publicar un comentario en la entrada