我想获得按值排序的键值对,如果值相等,我想按键升序排序。
我尝试使用 PriorityQueue 如下,但由于某种原因我得到了空指针。请帮助我理解这个问题并可能回答我的疑问。
这是我想出的,但不幸的是代码的输出是
PQ:[你好,是的]
正如我所期待的那样
PQ:[不,你好]
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>() {{
put("Hello", 50);
put("Yes", 50);
put("No", 100);
}};
PriorityQueue<String> pq = new PriorityQueue<>((a, b) -> {
if (map.get(a).equals(map.get(b))) return a.compareTo(b);
else return Integer.compare(map.get(b), map.get(a));
});
verifyPQ(map, pq));
System.out.println(pq);
}
private static void verifyPQ(Map<String, Integer> map, PriorityQueue<String> pq) {
for (String key : map.keySet()) {
pq.add(key);
if (pq.size() > 2) {
pq.poll();
}
}
}
为什么不使用比较器而不是使用优先级队列使事情变得不必要的复杂化?
如果我理解正确的话,你想按值降序排序,按键升序排序。
Map<String, Integer> map = new HashMap<>();
map.put("Hello", 50);
map.put("Yes", 50);
map.put("No", 100);
map.entrySet()
.stream()
.sorted(Comparator.comparing(Entry<String,Integer>::getValue).reversed()
.thenComparing(Entry::getKey))
.forEach(System.out::println);
如果您只需要前两项,只需添加限制即可
map.entrySet()
.stream()
.sorted(Comparator.comparing(Entry<String,Integer>::getValue).reversed()
.thenComparing(Entry::getKey))
.limit(2)
.forEach(System.out::println);