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

Posted

技术标签:

【中文标题】根据Java中的值对地图进行排序的最简单方法是啥?【英文标题】:What is the easiest way to sort maps according to values in Java?根据Java中的值对地图进行排序的最简单方法是什么? 【发布时间】:2010-12-26 00:43:41 【问题描述】:

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

【问题讨论】:

您能更具体地说明您的问题吗?这可能是按值排序的替代方法,具体取决于您的实际问题。 【参考方案1】:

使用Collections.reverseOrder()。

【讨论】:

我认为这个问题的难点在于“根据价值观”,而不是“降序”【参考方案2】:

HashMap(及其前身Hashtable)本质上是无序的。即使您对其进行排序,它也将保持无序。如果您想保持插入顺序,请改用LinkedHashMap。如果您想对 keys 进行自动排序,无论插入顺序如何,请改用 SortedMap

如果你想对 values 上的Map 进行排序,那么你基本上需要将键/值对放在另一种可排序的数据结构中,例如List<Entry<K, V>>,然后在Compatator<Entry<K, V>> 的帮助下使用Collections#sort() 对其进行排序,最后用它重新填充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

要对其进行降序排序,请使用以下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.
    
);

【讨论】:

【参考方案3】:

这是我的做法:

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;

【讨论】:

以上是关于根据Java中的值对地图进行排序的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个列表中的值对列表进行排序

按值对 Html Select 的选项进行排序的最有效方法是啥,同时保留当前选定的项目?

java 根据其值对地图进行排序。资料来源:http://stackoverflow.com/a/2581754/1057348

基于多个值对地图进行排序(Java8/Jooq)

如何根据值对 HashMap 的元素进行排序? [复制]

如何根据特定行中的值对 numpy 数组进行排序?