Вот 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>());
Посмотрите библиотеки Google Guava . В нем есть Multiset
, который выполняет вычисления за вас, а затем у вас есть класс Ordering
, который упрощает сортировку.
Все, что вам нужно сделать, это заполнить Multiset
своими строками. Это будет поддерживать частоту для вас. Затем вы можете отсортировать эти строки, используя Ordering
.
Возможно, это не самое элегантное решение, но как насчет этого?
//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.");
}
}
вы можете использовать интерфейс SortedMap для сортировки HashMap. Это очень просто - автоматическая сортировка. См. http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html . Я не включил сюда никакого кода, но если вам нужно, просто добавьте комментарий. Я дам вам образец кода.