【问题标题】:Process string using Java streams使用 Java 流处理字符串
【发布时间】:2020-04-06 18:12:56
【问题描述】:

我需要一些指导。我不确定如何使用 Java Streams 将示例文本文件读入对象数组。流是否提供了从文件中读取的字符串中正确输出字符位置的功能?

我正在使用 Java I/O 读取文件,然后将内容作为字符串传递给此函数以创建 Squares 数组....

可以使用 Java 8 Stream 创建对象数组吗?如果是这样请如何。谢谢。

【问题讨论】:

  • 你在那里尝试过吗?我希望你的意思是在那里标记java-stream 而不是stream
  • 我建议不要这样做。与使用流的解决方案相比,您现有的代码将更快且更容易理解。
  • 能否请您给我们看几行您的输入文件?
  • @NomadMaker - 这隐含在他阅读它的方式中。它由多行字符组成,每行代表一行,每个字符代表行内对应列的Square
  • @Stephon C 是的,我知道他是如何阅读它的。但是,查看文件会显示他是否忽略了任何内容:标题行、cmets 等。

标签: java java-8 java-stream maze


【解决方案1】:

使用 java 流,您可以执行以下操作:

        AtomicInteger row = new AtomicInteger(-1);
        // count specific characters with this:
        AtomicInteger someCount = new AtomicInteger();
        try (Stream<String> stringStream = Files.lines(Paths.get("yourFile.txt"))) { // read all lines from file into a stream of strings

            // This Function makes an array of Square objects of each line
            Function<String, Square[]> mapper = (s) -> {
                AtomicInteger col = new AtomicInteger();
                row.incrementAndGet();
                return s.chars()
                        .mapToObj(i -> {
                            // increment counter if the char fulfills condition
                            if((char)i == 'M')
                                someCount.incrementAndGet();
                            return new Square(row.get(), col.getAndIncrement(), (char)i);
                        })
                        .toArray(i -> new Square[s.length()]);
            };

            // Now streaming all lines using the mapper function from above you can collect them into a List<Square[]> and convert this List into an Array of Square objects
            Square[][] squares = stringStream
                    .map(mapper)
                    .collect(Collectors.toList()).toArray(new Square[0][]);
        }

回答您的第二个问题:如果您有一个 Square[] 数组,并且想要找到第一个具有 val == 'M' 的 Square,您可以这样做:

Optional<Square> optSquare = Stream.of(squares).flatMap(Stream::of).filter(s -> s.getVal() == 'M').findFirst();

// mySquare will be null if no Square was matching condition
Square mySquare = optSquare.orElse(null);

【讨论】:

  • - 如果我对循环中的特定字符进行了额外检查, if( char(i,j) == 'M') someCount++;我可以使用相同的流吗?
  • @UserIkhar 我添加了一些用于增加特殊字符计数器的代码
  • 正如预测的那样,这段代码比使用简单循环的原始版本复杂得多。如果你对它进行基准测试(正确!)我预测这个版本也会慢很多。
  • @mexicomanni - 如果我们必须从循环返回一个对象怎么办?我尝试过使用 IntStream 但没有让它工作.. for (int i = 0 ; i
  • @UserIkhar 你会在哪里设置 Square 的 val? - 如果您只想找到第一个带有字符 M 的 Square,您可以映射到 Square 对象,然后将 filter(predicate) 与您的条件一起使用,然后得到一个 Optional&lt;Square&gt;findFirst()
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2015-01-21
  • 2015-12-13
  • 1970-01-01
  • 2015-02-11
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多