如何对存储AtomicInteger值的HashMap按值降序排序(无法用reverseOrder)
解决HashMap按值降序排序的问题
嗨,我来帮你搞定这个按值降序排序的需求~你现在的代码已经能实现升序,只需要调整比较器的逻辑就能轻松改成降序,这里给你几个可行的方案:
方案1:给升序比较器添加reversed()反转
这是最直接的修改方式,你原来的Comparator.comparingInt(...)返回的是一个升序的比较器,只需要调用它的reversed()方法就能得到降序的比较器,直接替换到sorted方法里就行:
LinkedHashMap<String, AtomicInteger> collect = counterMap.entrySet() .stream() .sorted(Comparator.comparingInt(a -> a.getValue().get()).reversed()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
方案2:手动实现降序的比较逻辑
如果你不想用reversed(),也可以直接在比较的时候交换两个元素的顺序,用Integer.compare(b.getValue().get(), a.getValue().get())来实现降序:
LinkedHashMap<String, AtomicInteger> collect = counterMap.entrySet() .stream() .sorted((a, b) -> Integer.compare(b.getValue().get(), a.getValue().get())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
这里的逻辑是:原本升序是比较a和b的值,返回负数表示a在前;现在反过来比较b和a的值,就能让大的值排在前面。
方案3:结合reverseOrder()的正确用法
你提到没法在sorted里用reverseOrder(),可能是没找对正确的结合方式。其实可以把提取值的函数和reverseOrder()配合使用,比如:
LinkedHashMap<String, AtomicInteger> collect = counterMap.entrySet() .stream() .sorted(Comparator.comparing(Map.Entry::getValue, Comparator.comparingInt(AtomicInteger::get).reversed())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
这几个方案都能实现按AtomicInteger的值降序排序,你可以根据自己的习惯选择其中一种~
内容的提问来源于stack exchange,提问作者parrotjack
相关产品推荐
相关产品推荐

