sort ordenar ordenado mapa como collection java sorting hashmap xpages

ordenar - order map key java



Ordenar un HashMap por fecha (6)

Para simplificar, supongo que ese tipo de mapa es algo así como el Map<String, MyClass> map donde MyClass tiene un método como getDate() que devuelve expPayDate .

Mi problema es cuál es la mejor manera de determinar el artículo con la fecha más reciente.

Si desea buscar entrada de mapa único cuyo valor contiene la fecha máxima , no necesita ordenar todo el mapa que, en el mejor de los casos, le daría O (n * logn). Lo que necesita es iteración simple de todos los elementos en el mapa y compararlos con el máximo actual, que será la operación O (n).

Puede usar stream() (funcionalidad agregada en Java 8) y su método max . Este método necesita Comparator y puede crear uno fácilmente utilizando el método de comparing y pasando la expresión lambda que devolverá el valor que se debe usar al comparar.

Entonces tu código puede verse como

//import java.util.Map.Entry; Optional<Entry<String, MyClass>> max = map.entrySet().stream() .max(Comparator.comparing(e -> e.getValue().getDate())); Entry<String, MyClass> entry = max.get(); MyClass maxMC = entry.getValue();

Si no puede usar Java 8, puede escribir su propio método que iterará sobre los elementos y encontrará max. Tal método puede verse como

public static <T> T max(Iterable<T> iterable, Comparator<T> comp) { Iterator<T> it = iterable.iterator(); T max = null; if (it.hasNext()) { max = it.next(); } while (it.hasNext()) { T tmp = it.next(); if (comp.compare(max, tmp) < 0) max = tmp; } return max; }

y puedes usarlo como

Comparator<Entry<String, MyClass>> myComparator = new Comparator<Entry<String, MyClass>>() { @Override public int compare(Entry<String, MyClass> o1, Entry<String, MyClass> o2) { return o1.getValue().getDate().compareTo(o2.getValue().getDate()); } }; Entry<String, MyClass> maxEntry = max(map.entrySet(), myComparator); MyClass max = maxEntry.getValue();

En una clase de Java, tengo un método para reordenar un HashMap existente por fecha. El HashMap es de un tipo <String, Object> donde el objeto contiene un campo llamado expPayDate y la cadena de clave es un número secuencial convertido en una cadena. Por lo tanto, necesito recorrer los elementos en el mapa fuente y encontrar el elemento con el fecha más reciente y cópielo en una tempmap en el orden correcto. Mi problema es cuál es la mejor manera de determinar el artículo con la fecha más reciente.


Si solo necesita la fecha mínima o máxima, un simple para cada ciclo puede ser suficiente:

Date maxDate = null; for (Entry<String, Object> item: hashMap.entrySet()) if (maxDate == null || maxDate before((Date)item.getValue())) maxDate = (Date)item.getValue();

De esta forma, la complejidad es solo O (n) y las operaciones de inserción y eliminación son más baratas que utilizando sortedMap . De todos modos, creo que la sugerencia de sortedMap (usando sortedMap ) es más elegante.


Su mejor opción será usar un SortedMap con la interfaz del Comparador .

Aquí hay un ejemplo:

public SortedMap<String, Object> getSortedMap(Map<String, Object> originalMap) { SortedMap<String, Object> tmpMap = new TreeMap<String, Object>(new Comparator<String>(){ @Override public int compare(String key1, String key2) { //logic for comparing dates } }); tmpMap.putAll(originalMap); return tmpMap; }


Use un TreeMap en lugar de HashMap. se ordenará automáticamente en la inserción.

Map< Date, Object> m = new TreeMap< Date, Object>();

Alternativamente, si tiene un HashMap existente y desea crear un TreeMap basado en él, páselo al constructor:

Map< Date, Object> sortedMap = new TreeMap< Date, Object>(m);

Espero que te ayude.


  1. Obtenga todas las entradas llamando entrySet() método entrySet() de Map

  2. Cree un Comparator personalizado para ordenar las entradas según los valores

  3. Convertir Entry establecida en List

  4. Ordenar la lista de entradas utilizando el método Collections.sort() pasando su comparador de valores

  5. Cree un LinkedHashMap agregando entradas en orden ordenado.

Mira el código de ejemplo @ Sort HasMap por valor


La solución correcta depende de sus limitaciones de rendimiento.

Si su problema es encontrar el artículo con la fecha más reciente, entonces, si el rendimiento de O (n) es correcto, puede hacer un escaneo de los valores () en su HashMap y encontrar el mínimo de esa manera.

Depende de la frecuencia con la que necesite hacer esto en relación con otro acceso en la estructura de datos. Sería perfectamente razonable utilizar un SortedMap o utilizar una estructura de datos secundaria, como PriorityQueue (actuando como un montón en la fecha), según sus patrones de acceso para esta estructura de datos.