TreeMap: сортировка значений карты с ключами, перемещающимися вместе со значениями - PullRequest
1 голос
/ 27 января 2010

У меня есть следующее TreeMap:

TreeMap<Integer, Double> map;

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

Я выполняю итерацию по карте с помощью клавиш Integer и функций firstEntry () и upperEntry () и изменяю значения Double.

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

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

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

Ответы [ 3 ]

3 голосов
/ 27 января 2010

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

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

1 голос
/ 27 января 2010

вы можете построить 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] (nb: [Math.E, Math.PI, Math.UNIVERSAL_ANSWER] :-).

PS

the 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());
    }
}
0 голосов
/ 27 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...