Java计算字符串的出现并按相反顺序排序

时间:2018-07-13 00:59:45

标签: java string sorting linkedhashmap

在尝试计算字符串出现并按降序对它们进行排序时遇到了一些麻烦。这是样本输入的列表:

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,计数器是正确的。但是,它只是不按降序排序。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

尽管使用LinkedHashMap会导致结果保持其顺序,但实际上您从未将collect操作的结果分配给sortedTextSegmentList。结果,您的forEach遍历了您创建的第一张地图,该地图没有按照您想要的方式排序。

答案 1 :(得分:0)

我认为您一直在查看“ sortedTextSegmentList”,该列表的出现顺序与您看到它们的顺序相同,即“测试到今天,明天”

尝试以下方法:

fastboot

sortedMap应该具有您要查找的顺序中的数据。