Mapa de árbol:Ordenar valores de un mapa con claves que se mueven junto con los valores
-
23-09-2019 - |
Pregunta
Tengo el siguiente TreeMap:
TreeMap<Integer, Double> map;
los valores dobles no son únicos.
Repito el mapa usando teclas de número entero y las funciones firstEntry() y lowerEntry() y modifico los valores dobles.
Ahora quiero enumerar los valores de los pares en orden decreciente de valores Dobles.¿Cuál es la mejor manera de hacer esto?
esas claves enteras son importantes para mí y como los valores dobles no son únicos, no puedo tener una clave doble.
Actualizar:Más explicación es el problema clásico.digamos que el número de estudiantes es la clave y su porcentaje es el valor.Ahora ordene por porcentaje y luego deberíamos poder saber de quién es el porcentaje.por lo tanto necesito la clave entera.
Solución
puedes construir un TreeSet
, que garantiza el orden de inserción:
@Test
public void treeMapSortedByValue() {
// given the following map:
TreeMap<Integer, Double> map = new TreeMap<Integer, Double>();
map.put(2, Math.E);
map.put(1, Math.PI);
map.put(3, 42.0);
// build a TreeSet of entries
Set<Map.Entry<Integer, Double>> sortedEntries = new TreeSet<Map.Entry<Integer, Double>>(new DoubleComparator());
sortedEntries.addAll(map.entrySet());
// optionally you can build a List<Double> with the sorted
List<Double> doubles = new LinkedList<Double>();
for (Map.Entry<Integer, Double> entry : sortedEntries) {
doubles.add(entry.getValue());
}
}
esto debería darte: [2.718281828459045, 3.141592653589793, 42.0]
(nótese bien: [Math.E, Math.PI, Math.UNIVERSAL_ANSWER]
:-).
PD
el Comparator
:
class DoubleComparator implements Comparator<Map.Entry<Integer, Double>> {
@Override
public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {
return Double.compare(o1.getValue(), o2.getValue());
}
}
Otros consejos
La solución obvia es obtener una colección de los dobles (posiblemente a través del - la clase TreeMap tiene un entrySet
y luego getValue
values()
método, puedes usarlo) y proceder a ordenarlos (usando Collections.sort
o Arrays.sort
) - esto, sin embargo, tomaría O(n logn) tiempo.
No estoy seguro de que puedas hacerlo de una manera más inteligente (== más rápida), a menos que cambies completamente la estructura de datos.Sin embargo, la única forma en que veo que esto suceda con otra estructura de datos es manteniendo un contenedor sobre el número entero y el doble y escribiendo dos comparadores, uno que compara el integer
y uno que se compara primero por el double
y luego por el integer
.El TreeMap original que está utilizando sería el mismo, pero podría separar otro TreeMap, ordenado por el segundo comparador.Sin embargo, la desconexión aún llevaría O(n logn) tiempo.
Lo que puedes hacer es lo siguiente: usar entrada para iterar a través de las entradas. Póngalos en una lista. Ordene la fecha con el comparador correcto entonces.