Сортировка HashMap на основе Значения затем Ключ? [дубликат]

6
задан Community 23 May 2017 в 12:03
поделиться

4 ответа

Вот Comparator , который сортирует объекты Map.Entry с Comparable ключами и значениями:

public class ValueThenKeyComparator<K extends Comparable<? super K>,
                                    V extends Comparable<? super V>>
    implements Comparator<Map.Entry<K, V>> {

    public int compare(Map.Entry<K, V> a, Map.Entry<K, V> b) {
        int cmp1 = a.getValue().compareTo(b.getValue());
        if (cmp1 != 0) {
            return cmp1;
        } else {
            return a.getKey().compareTo(b.getKey());
        }
    }

}

Вы должны положить все записи карты в список, а затем отсортируйте его:

List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(h.entrySet());
Collections.sort(list, new ValueThenKeyComparator<String, Integer>());
10
ответ дан 8 December 2019 в 18:32
поделиться

Посмотрите библиотеки Google Guava . В нем есть Multiset , который выполняет вычисления за вас, а затем у вас есть класс Ordering , который упрощает сортировку.

Все, что вам нужно сделать, это заполнить Multiset своими строками. Это будет поддерживать частоту для вас. Затем вы можете отсортировать эти строки, используя Ordering .

3
ответ дан 8 December 2019 в 18:32
поделиться

Возможно, это не самое элегантное решение, но как насчет этого?

//TreeSet with reversed natural ordering (big integers first)
Map<Integer, Set<String>> h = 
     new TreeMap<Integer, Set<String>>(Collections.reverseOrder());
//and use TreeSet for the set...
// ...    
// 
for(Map.Entry<Integer,Set<String>> entry : h.entrySet()){
    for(String str : entry.getValue()){
        System.out.println(str + " has occured " + entry.getKey() + " times.");
    }
}
2
ответ дан 8 December 2019 в 18:32
поделиться

вы можете использовать интерфейс SortedMap для сортировки HashMap. Это очень просто - автоматическая сортировка. См. http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html . Я не включил сюда никакого кода, но если вам нужно, просто добавьте комментарий. Я дам вам образец кода.

-2
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: