Древовидная карта:Сортировка значений карты с помощью клавиш, перемещающихся вместе со значениями

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

  •  23-09-2019
  •  | 
  •  

Вопрос

у меня есть следующая древовидная карта:

TreeMap<Integer, Double> map;

значения Double не являются уникальными.

я перебираю карту, используя целочисленные ключи и функции firstEntry() и higherEntry(), и изменяю двойные значения.

Теперь я хочу перечислить значения пар в порядке убывания двойных значений.как лучше всего это сделать?

эти целочисленные ключи важны для меня, и поскольку двойные значения не уникальны, у меня не может быть двойного ключа.

Обновление:Более подробное объяснение - это классическая проблема.допустим, количество студентов - это ключ, а их процент - это значение.теперь отсортируйте по процентам, и тогда мы сможем определить, чей это процент.поэтому мне нужен целочисленный ключ.

Это было полезно?

Решение

вы можете построить TreeSet, что гарантирует порядок вставки:

@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());
    }
}

это должно дать вам: [2.718281828459045, 3.141592653589793, 42.0] (примечание: [Math.E, Math.PI, Math.UNIVERSAL_ANSWER] :-).

пс

то 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());
    }
}

Другие советы

Очевидным решением является получение коллекции двойников (возможно, через entrySet и затем getValue - класс TreeMap имеет values() метод, вы можете просто использовать это), и приступайте к их сортировке (используя Collections.sort или Arrays.sort) - это, однако, заняло бы O(n логинов) времени.

Я не уверен, что вы сможете сделать это более разумным (== быстрым) способом, если только полностью не измените структуру данных.Однако единственный способ, которым, как я вижу, это происходит с другой структурой данных, - это сохранить оболочку над целым числом и double и записать два компаратора - один, который сравнивает integer и тот, который сравнивается первым по double а затем по integer.Исходная древовидная карта, которую вы используете, была бы такой же, но вы могли бы отделить от нее другую древовидную карту, отсортированную по второму компаратору.Однако отсоединение все равно заняло бы O(n логинов) времени.

Вы можете сделать следующее: Используйте вход итерации через записи. Поместите их в список. Сортируйте дату с правильным компаратором тогда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top