根据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