Mapa de árbol:Ordenar valores de un mapa con claves que se mueven junto con los valores

StackOverflow https://stackoverflow.com/questions/2145853

  •  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.

¿Fue útil?

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 entrySet y luego getValue - la clase TreeMap tiene un 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top