根据Java中的值对地图进行排序的最简单方法是什么?

时间:2009-12-12 17:18:14

标签: java sorting hashtable

我希望我的哈希值根据值按降序排序。我如何用Java做到这一点?

3 个答案:

答案 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;

}