嘿,我需要计算单词的频率并返回一个列出它们的字符串.我必须省略少于4个字符的单词和计数小于10的单词.我必须把它们从最高点到最低点排序,如果数量相同,还要按字母顺序排序.

import java.util.*;
import java.util.stream.*;

public class Words {

    public String countWords(List<String> lines) {

    String text = lines.toString();
    String[] words = text.split("(?U)\\W+");

    Map<String, Long> freq = Arrays.stream(words).sorted()
        .collect(Collectors.groupingBy(String::toLowerCase,
            Collectors.counting()));

    LinkedHashMap<String, Long> freqSorted = freq.entrySet().stream()
        .filter(x -> x.getKey().length() > 3)
        .filter(y -> y.getValue() > 9)
        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
        .collect(Collectors.toMap(Map.Entry::getKey,
            Map.Entry::getValue, (oldValue, newValue) -> oldValue,
            LinkedHashMap::new));

    return freqSorted.keySet().stream()
        .map(key -> key + " - " + freqSorted.get(key))
        .collect(Collectors.joining("\n", "", ""));
    }
}

我不能改变这个方法的论点.在按值排序后,我很难按字母顺序排序.try 使用thenCompare,但无法使其工作.除此之外,我非常感谢任何关于如何减少行数的反馈,这样我就不必流3次.

推荐答案

这里有一种方法.我使用你的频率计数图作为源.

  • 首先定义一个comparator.
  • 然后排序将现有 map 按排序
  • toMap采用keyvaluemerge functionLinkedhashMap的最终映射来保持顺序.
Comparator<Entry<String, Long>> comp =
        Entry.comparingByValue(Comparator.reverseOrder());
comp = comp.thenComparing(Entry.comparingByKey());

Map<String, Long> freqSorted = freq.entrySet().stream()
        .filter(x -> x.getKey().length() > 3
                && x.getValue() > 9)
        .sorted(comp)
        .collect(Collectors.toMap(Entry::getKey,
                Entry::getValue, (a, b) -> a,
                LinkedHashMap::new));

笔记:

  • 为了验证排序是否正确,您可以注释掉过滤器并使用更少的单词.
  • 在准备频率计数时,您不需要对初始词流进行排序,因为它们将在最终映射中进行排序.
  • 合并函数在语法上是必需的,但没有使用,因为没有重复项.
  • 我 Select 不使用TreeMap,因为一旦流被排序,就不需要再次排序.

Java相关问答推荐

有关手动创建的包的问题

为什么我的ArrayList索引的索引总是返回-1?

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

是否在允许数组元素为空时阻止 idea 为空性警告?

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

如何从Keyloak映射Hibernate实体中的用户

Jenv-相同的Java版本,但带有前缀

如何将Java文档配置为在指定的项目根目录中生成?

如何在ApacheHttpClient 5中为单个请求设置代理?

为什么没有加载java.se模块?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

让标签占用JavaFX中HBox的所有可用空间

如何在更改分辨率时将鼠标坐标计算为世界坐标

java 11上出现DateTimeParseException,但java 8上没有

java.util.LinkedList()是如何成为MutableList的实例的?

更新不可变的深层嵌套字段

一条Java记录可以保存多少个字段?

BigDecimal stripTrailingZeros 和相等

从使用 Spring Boot 开发的 Soap 请求中检索自定义标头详细信息

单元测试 KafkaStreams 给出 IllegalArgumentException:未知主题