2010-01-27 2 views
1

у меня есть следующий TreeMap:TreeMap: Сортировать значения карты с ключами двигаясь со значениями

TreeMap<Integer, Double> map; 

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

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

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

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

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

+0

Могу ли я спросить, что представляют Целые? Зная, что это поможет предложить другую структуру данных вместо TreeMap ... – pgras

+0

Можете ли вы прояснить заголовок? Неясно, какое поле вы пытаетесь сортировать. – cmcginty

ответ

1

вы можете построить 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

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

Что вы можете сделать, это следующее: используйте entrySet для повторения записей. Поместите их в список. Затем сортируйте дату с помощью правого компаратора.

+0

Он не может, TreeMap позволяет только уникальные ключи. – laura

+0

черт, noobie ошибка, мой плохой. Я попытаюсь найти другое решение –

+0

изменил решение –

3

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

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

Смежные вопросы