gpt4 book ai didi

java - 如何通过集合改进 Map 值的排序

转载 作者:行者123 更新时间:2023-11-29 03:56:17 28 4
gpt4 key购买 nike

当我需要根据值对 Map 进行排序时,我经常会遇到这种情况。 map 在 JDK 中并不适用于此,我决定不使用 Guava(好像这个东西是 one liner 但我不太明白)也不使用 Apache Commons,所以我这样做了。顺便说一句 this是一个非常受欢迎的问题,但大多数答案都在某种程度上是错误的。

    Map<String, Long> map = new HashMap<String, Long>();
// populate
List<Map.Entry<String, Long>> list = new LinkedList<Map.Entry<String,Long>>();
for (Map.Entry<String, Long> entry : map.entrySet()) {
list.add(entry);
}
Collections.sort(list, new MapComparable());
LinkedHashMap<String, Long> linkedMap = new LinkedHashMap<String, Long>();

for (Map.Entry<String, Long> entry : list) {
linkedMap.put(entry.getKey(), entry.getValue());
}
}

public static class MapComparable implements Comparator<Map.Entry<String, Long>>{

public int compare(Entry<String, Long> e1, Entry<String, Long> e2) {
return (e1.getValue()<e2.getValue() ? -1 : (e1.getValue()==e2.getValue() ? 0 : 1));
}
}

我的问题是,是否有更好的方法将 EntrySet 传入/传出 Collection ?看起来不太好。

这可靠吗?

最佳答案

我认为对您的方法有非常细微的改进:

Queue queue = new PriorityQueue( map.size(), new MapComparable() );

queue.addAll( map.entrySet() );

LinkedHashMap<String, Long> linkedMap = new LinkedHashMap<String, Long>();

for (Map.Entry<String, Long> entry; (entry = queue.poll())!=null;) {
linkedMap.put(entry.getKey(), entry.getValue());
}

换句话说,使用专为排序设计的数据结构进行排序。

作为一般说明,代码如下

for (Map.Entry<String, Long> entry : map.entrySet()) {
list.add(entry);
}

可以缩短为:

list.addAll( map.entrySet() );

无论何时处理Collection

我也是这样认为的:

public int compare(Entry<String, Long> e1, Entry<String, Long> e2) {
return e1.getValue().compareTo(e2.getValue());
}

更干净。

关于java - 如何通过集合改进 Map 值的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6233191/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com