我希望我的哈希值根据值按降序排序。我如何用Java做到这一点?
答案 0 :(得分:13)
HashMap
(及其遗留的前身Hashtable
)本质上是无序的。即使你对它进行排序,它仍将是无序的。如果您想维护广告订单,请改用LinkedHashMap
。如果您想要对键进行自动排序,而不考虑广告订单顺序,请改用SortedMap
。
如果您想对值上的Map
进行排序,那么您基本上需要将键/值对放在另一种可排序的数据结构中,例如List<Entry<K, V>>
,然后在Collections#sort()
的帮助下使用Compatator<Entry<K, V>>
对其进行排序,最后用LinkedHashMap
重新填充HashMap
,否则您将再次失去订购)。
这是一个基本示例(将明显的运行时异常处理放在一边):
// Prepare.
Map<String, String> map = new HashMap<String, String>();
map.put("foo", "bar");
map.put("bar", "waa");
map.put("waa", "foo");
System.out.println(map); // My JVM shows {waa=foo, foo=bar, bar=waa}
// Get entries and sort them.
List<Entry<String, String>> entries = new ArrayList<Entry<String, String>>(map.entrySet());
Collections.sort(entries, new Comparator<Entry<String, String>>() {
public int compare(Entry<String, String> e1, Entry<String, String> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
// Put entries back in an ordered map.
Map<String, String> orderedMap = new LinkedHashMap<String, String>();
for (Entry<String, String> entry : entries) {
orderedMap.put(entry.getKey(), entry.getValue());
}
System.out.println(orderedMap); // {foo=bar, waa=foo, bar=waa}
要对其进行排序 descencing ,请使用以下Comparator
。基本上只需交换条目进行比较:
Collections.sort(entries, new Comparator<Entry<String, String>>() {
public int compare(Entry<String, String> e1, Entry<String, String> e2) {
return e2.getValue().compareTo(e1.getValue()); // Sorts descending.
}
});
答案 1 :(得分:1)
答案 2 :(得分:0)
我是这样做的:
public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) return 1;
else return compare;
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}