Древовидная карта:Сортировка значений карты с помощью клавиш, перемещающихся вместе со значениями
-
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());
}
}
Другие советы
Очевидным решением является получение коллекции двойников (возможно, через - класс TreeMap имеет entrySet
и затем getValue
values()
метод, вы можете просто использовать это), и приступайте к их сортировке (используя Collections.sort
или Arrays.sort
) - это, однако, заняло бы O(n логинов) времени.
Я не уверен, что вы сможете сделать это более разумным (== быстрым) способом, если только полностью не измените структуру данных.Однако единственный способ, которым, как я вижу, это происходит с другой структурой данных, - это сохранить оболочку над целым числом и double и записать два компаратора - один, который сравнивает integer
и тот, который сравнивается первым по double
а затем по integer
.Исходная древовидная карта, которую вы используете, была бы такой же, но вы могли бы отделить от нее другую древовидную карту, отсортированную по второму компаратору.Однако отсоединение все равно заняло бы O(n логинов) времени.
Вы можете сделать следующее: Используйте вход итерации через записи. Поместите их в список. Сортируйте дату с правильным компаратором тогда.