>

16 abril 2009

Ordenar un HashMap (HasMap)

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.

9 comentarios:

Anónimo dijo...

te mastaste haciendo ese ordenamiento!! gracias sirve de mucho

Kio dijo...

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

Kio dijo...

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 .

Luis R dijo...

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!

rushmata dijo...

Genial el Algoritmo de ordenación. Gracias por el aporte.

Ernesto dijo...

//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

Ernesto dijo...

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

iSoporte dijo...

Super
Me ahorraste un buen de tiempo Y mi lista se ve mas padre ahora!!!

Sigue asi mi buen

Unknown dijo...

Ernesto,gracias por el aporte, pero te cuento que el compilador me dio error en el foreach, aparentemente no le gusta el tipo de datos String llave, por ende lo defini como Object y funcionó tal cual muestras por salida de consola. Desde ya muchas gracias y excelente tu aporte. Saludos Dario.-