在尝试计算字符串出现并按降序对它们进行排序时遇到了一些麻烦。这是样本输入的列表:
test, test, to, to, to, to, today, tomorrow, today
所需的输出按以下顺序:
to, test, today tomorrow
这是我的代码,用于计算字符串的出现并以相反的顺序对其进行排序:
Map<String, Integer> sortedTextSegmentList = new LinkedHashMap<String, Integer>();
for (String s : textSegmentList) {
if (sortedTextSegmentList.get(s) != null) {
sortedTextSegmentList.put(s, sortedTextSegmentList.get(s) + 1);
} else {
sortedTextSegmentList.put(s, 1);
}
}
sortedTextSegmentList.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y)-> {throw new AssertionError();}, LinkedHashMap::new
));
但是,我得到以下输出:
test, to, today, tomorrow
当我尝试打印时:
sortedTextSegmentList.forEach((key, value) -> {
System.out.println("KEY" + key);
System.out.println("VALUE " + value);
});
我正在测试2,到4,明天1,今天2,计数器是正确的。但是,它只是不按降序排序。有什么想法吗?
谢谢!
答案 0 :(得分:1)
尽管使用LinkedHashMap
会导致结果保持其顺序,但实际上您从未将collect
操作的结果分配给sortedTextSegmentList
。结果,您的forEach
遍历了您创建的第一张地图,该地图没有按照您想要的方式排序。
答案 1 :(得分:0)
我认为您一直在查看“ sortedTextSegmentList”,该列表的出现顺序与您看到它们的顺序相同,即“测试到今天,明天”
尝试以下方法:
fastboot
sortedMap应该具有您要查找的顺序中的数据。