2012-01-28 12 views
8

tengo un problemacómo ordenar las teclas HashMap

HashMap<String, List<AppPrjMilestone>> dateMilestoneMap 
           = new HashMap<String, List<AppPrjMilestone>>(); 

estoy poniendo dinámica de claves en el objeto Hashmap así:

dateMilestoneMap.put(""+crateDate,value); 

Finalmente estoy consiguiendo resultado como este:

("28/01/2012",value) 
("01/01/2012",value) 
("26/01/2012",value) 

Quiero pares de valores de clave de retorno en orden desc o asc. ¿Cómo puedo hacer eso?

+1

Pruebe TreeMap y lea el Javadoc: http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html – home

+0

¿Alguna razón por la que está utilizando un mapa en lugar de una lista? – kba

+0

TreeMap es la solución sin complicaciones aquí. Hay más discusión sobre esto en http://stackoverflow.com/questions/7860822/sorting-hashmap-based-on-keys – Bob

Respuesta

20

Los HashMaps no almacenan el orden de las claves por definición. Sin embargo, puede lograr esto adquiriendo una matriz de las teclas a través de: Object[] keys = map.keySet().toArray(); Luego ordenando la lista con Arrays: Arrays.sort(keys); y finalmente iterando a través de cada clave y recuperando el valor de HashMap.

for(Object key : keys) { System.out.println(map.get(key)); }

La operación de clasificación aquí hará que el algoritmo de ejecución en O (n lg n) en lugar de O (n), que sería posible utilizando una estructura de datos de clasificación.

Esto ordenará la lista lexicográficamente. Dado que parece que su pregunta usa el formato de fecha común de los EE. UU., Esto ordenará la lista por día, mes y año. Esto probablemente no sea correcto. Puede usar un formato de cadena de año, mes, día de la fecha o adoptar un objeto clave más apropiado. DataTime y DateTimeComparator de Joda-Time serían bastante útiles. Simplemente use DateTime como la clave y una instancia de DateTimeComparator cuando llame al Arrays.sort(keys, comparator);.

+0

¿Por qué no 'Collection.sort'? ¿Y por qué no usar un comparador en 'Map.Entry'? –

+1

Collections.sort (...) funciona pero toma una lista, que HashMap no implementa. Tendría que convertirlo en ArrayList a través de ArrayList (mapa). Al final, es básicamente el mismo mecanismo. Si las claves son cadenas, se ordenarán lexicográficamente. – allingeek

+0

Puede ordenar Map.keySet(). – user949300

0

Le sugiero que cambie la clave HashMap de Cadena a Fecha, p. HashMap<Date, List<AppPrjMilestone>>. Eso debería hacer el truco.

Uy - hacen que un TreeMap<Date, List<AppPrjMilestone>>

+1

No, eso no debería. – vitaut

2

HashMap no proporciona ningún pedido cuando iterar sobre ella (o incluso garantizan que el orden será el mismo si se recorre varias veces). Si desea un pedido natural sobre las teclas, intente TreeMap. Tenga en cuenta que sus cadenas están formateadas en dd/mm/yy, por lo tanto, cuando las ordene TreeMap, irá ascendiendo primero por día, no por año, lo que probablemente no sea lo que desea. Deberías o cuerdas uso como yy/mm/dd, cambiar al uso de una clase que encapsula la información mejor así Date, o definir su propio Comparator al construir el TreeMap que sabe cómo ordenar sus dd/mm/yy cuerdas en el orden correcto

+1

Estoy bastante seguro de que la pregunta era sobre ordenar las claves de un HashMap. – allingeek

+0

@allingeek No soy. Era vago, pero creo que quiere pasar el cursor por encima del mapa y obtener las claves en orden ascendente o descendente, por lo que debería usar un mapa que lo proporcione. Si es literalmente "Necesito utilizar un HashMap, pero quiero que las claves estén en orden de todos modos", probablemente debería especificar eso, pero creo que es más "Estoy usando HashMap pero no hace lo que quiero, ¿cómo puedo ¿tratar con él?" –

+0

Hacer una copia TreeMap de HashMap podría ser la mejor manera de ordenar las claves. –

0

HashMap doesn' t define el orden de iteración sobre los elementos. Si desea recuperar elementos ordenados por clave, utilice el TreeMap. Sin embargo, dado que almacena las cadenas en el formato "DD/MM/YYYY", la orden probablemente no sea la que desea, así que utilice la fecha como clave o al menos una cadena de la forma como "AAAA-MM-DD". ".

3

Las claves de un mapa se almacenan en un Set que no se puede ordenar. Puede hacerlo agregando las teclas del conjunto de mapas en un List y clasificándolo en su lugar.

p. Ej.

List<Date> sortedKeys = new ArrayList<Date>(dateMilestoneMap.size()); 
sortedKeys.addAll(dateMilestoneMap.keySet()); 
Collections.sort(sortedKeys); //sorts in ascending date order 
          //(pass in custom Comparator to sort differently).. 

Aquí he utilizado la clase Date que es mucho mejor para el almacenamiento de fechas que las cadenas simples.

Cuestiones relacionadas