Java 8 Streams | textfile

时间:2018-05-13 18:26:53

标签: java java-8 java-stream

我试图在Streams上做一些练习并遇到以下问题:

我有一个文本文件,我想计算每行的平均字数。有人可以告诉我,我的思维方式是否正确?这里有一些假代码,我认为应该在实施之后做到这一点:

double wordCount(String filepath){
  return Files.lines(Paths.get(filepath))
                      // make a wordarray of the line
                      // average the size of every wordarray with something like that
                          (collect(Collectors.averagingDouble())

有人可以帮助我吗?

如何将一行转换为字符串数组?

如何获得该数组的大小?

4 个答案:

答案 0 :(得分:4)

缺少的两个步骤是:

  • 如何将一行转换为单词的Stringarray:split >> spaces

    < / LI>
  • 如何获取该数组的大小:获取其s.split(" "); &gt;&gt; length

  1. arr.length

    上使用专门操作
    IntStream
  2. 不太具体的double wordCount(String filepath) { try { return Files.lines(Paths.get(filepath)) .map(s -> s.split(" ")) .mapToInt(arr -> arr.length) .average() .orElse(-1.0); } catch (IOException e) { e.printStackTrace(); } return -1.0; } 操作(To avoid againt prop 1.

    Collectors

答案 1 :(得分:3)

你正在通过将一个字符串拆分成一串字符串来做不必要的工作,每个字一个字符串,用它们填充数组,然后只是为了询问数组的大小。

如果你想得到单词的数量,可以考虑一个简单的方法,只计算单词

private static final Pattern WORD = Pattern.compile("\\w+");
public static int wordCount(String s) {
    int count = 0;
    for(Matcher m = WORD.matcher(s); m.find(); ) count++;
    return count;
}

然后,您可以在Stream操作中使用此方法来获取平均字数:

Files.lines(Paths.get(filePath)).mapToInt(YourClass::wordCount).average().orElse(0)

使用Java 9,您可以重写wordCount方法以使用类似

的流
private static final Pattern WORD = Pattern.compile("\\w+");
public static int wordCount(String s) {
    return (int)WORD.matcher(s).results().count();
}

但是循环可能更有效,因为它省略了MatchResult实例的构造。

答案 2 :(得分:1)

private static void wordcount(String filePath) throws IOException {
    Path path = Paths.get(Paths.get(filePath).toUri());
    double result = Files.lines(path).map(s -> {
        String trimmed = s.trim();
        if (trimmed.isEmpty()) return 0;
        else return trimmed.split(" ").length;
    }).mapToInt(i -> i.intValue()).average().getAsDouble();

    System.out.println(result);
}

答案 3 :(得分:-1)

试试这个:

 try(Stream<String> lines = Files.lines(Paths.get("src/test.txt"))){

            OptionalDouble average =
                    lines.map(s -> s.split(" "))
                            .mapToInt(s -> s.length)
                            .average();

            System.out.println(average.getAsDouble());
        } catch (IOException e)
        {
            e.printStackTrace();
        }