public static void main(String[] args) {
Pattern selectWords = Pattern.compile("[^a-zA-Zа-яА-я0-9]+");
Scanner sc = new Scanner(System.in, "UTF-8").useDelimiter(selectWords);
List<String> buf = new ArrayList<>();
while (sc.hasNext()) {
buf.add(sc.next());
}
Stream<String> words = buf.stream();
Map<String, Long> frqWords = words.map((s) -> s.toLowerCase())
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Stream<Map.Entry<String, Long>> output = frqWords.entrySet().stream();
output.sorted(Comparator.comparing((Map.Entry<String, Long> e) -> e.getKey()))
.sorted(Comparator.comparing((Map.Entry<String, Long> e) ->
e.getValue()).reversed())
.limit(10)
.forEach((Map.Entry<String, Long> e) -> System.out.println(e.getKey()));
}
一切!我想出了如何解决这个问题。假期过后头很重。这是可以做到的。
这段代码的主要问题是第一个使用扫描器从输入流中读取单词的循环是无限的,也就是说,它必须至少受单词总数的限制。如果从文件中读取,就不会出现这个问题。
将输入的单词累积在列表中也是多余的,为此
stream().因此,可以隔离处理单词流的主要功能,
Stream<String>以便按频率显示前 N 个单词。您还应该确定如何显示具有相同频率的词。如果你想保留输入流中出现的顺序,你应该使用
LinkedHashMap::new地图作为提供者。如果您需要按字母顺序对其他单词进行排序,您可以使用TreeMap::new因此,可以使用 generator 调用这样的方法
Stream::generate,但有以下限制:或者可以创建基于扫描仪的单词流
StreamSupport,Spliterator如对主要 SO 的回答所示:How to make scanner strings into a Stream in Java?测试: