java - 查找Java 8时尚中的最大单词数

标签 java java-8 functional-programming java-stream

需要找到词组中每个句子的最大词数。句子用?.!符号分隔。

我几乎已经完成了这项任务,但是我坚持以纯Java 8的方式来完成它,您能帮我吗?

public static void main(String[] args) {
    assert solution("We test coders. Give us a try?") == 4;
    assert solution("Forget  CVs..Save time . x x") == 2;
    assert solution("Some some! time . x x") == 2;
}

public static int solution(String S) {
    return Arrays.stream(S.split("[.!?]"))
            .map(String::trim)
            .filter(s -> !s.isEmpty())
            .max(Comparator.comparingInt(o -> o.split(" ").length))
            .map(s -> s.split(" "))
            .flatMap(...); // <-- what to do here?

}

最佳答案

只需按"\\s+"分割单词即可(因此您将忽略多个空格字符)。然后从max()获取IntStream值。

Arrays.stream(str.split("[.!?]"))
      .map(String::trim)
      .filter(s -> !s.isEmpty()) 
      .mapToInt(s -> s.split("\\s+").length)
      .max()
      .orElse(0);

@Holger提出的更新答案:
Arrays.stream(str.split("\\s*+(?:[.!?]\\s*+)+"))
      .mapToInt(s -> s.split("\\s+").length)
      .max()
      .orElse(0);

还有另一种实用的样式方法(只是为了好玩)。我怀疑您是否需要它:)
Stream.of(str)
      .map(splittingBy("\\s*+(?:[.!?]\\s*+)+"))
      .flatMap(Arrays::stream)
      .map(splittingBy("\\s+"))
      .mapToInt(arr -> arr.length)
      .max()
      .orElse(0);

...

static Function<String, String[]> splittingBy(String regex) {
    return str -> str.split(regex);
}

关于java - 查找Java 8时尚中的最大单词数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55159951/

相关文章:

functional-programming - Perl 6使用reduce一次计算int数组的平均值

Clojure,在语法引用之外取消引用切片

java - 如何从 Eclipse 中的验证中排除 .java 文件

Java 8 flatMap + Optional.of 不编译

java - 如果使用枚举,如何清理代码太多

java - 如何在 java 11 中获取 rt.jar 依赖项?

string - Haskell 操作文件内容

java - 如何检查某个方法是否被调用?

java - 在 Spring Boot Eclipse 中使用多个外部 JAR

java - 为 BLE 秤编写应用程序代码 - 包含所有信息