gpt4 book ai didi

Java:读取文件输入内容并在找到某些线条图案序列时对其进行过滤

转载 作者:行者123 更新时间:2023-11-30 04:53:53 25 4
gpt4 key购买 nike

我需要处理输入文件,并将其内容(按 ilne 行)复制到输出文件。但是,此输入文件中有一些不重要的数据(杂散),我需要跳过。我试图解决的主要问题实际上比这更复杂,但我只是要简化问题:

所以,我有一个包含数十万行的输入文件。如果输入文件中出现以下三行序列:
一个
B
C

然后我需要跳过这 3 行并继续输入文件中的下一行。如果这 3 行作为连续行的序列出现,我只能跳过这 3 行。

例如:
输入文件:

一个
一个
B
C
B
P
一个
B
C
一个
B
一个
一个
B
C
一个

输出文件:
一个
B
P
一个
B
一个
一个

澄清:
一个
A(跳过)
B(跳过)
C(跳过)
B
P
A(跳过)
B(跳过)
C(跳过)
一个
B
一个
A(跳过)
B(跳过)
C(跳过)
一个

请注意,只有当行序列(A、B、C)按顺序出现时,我才能跳过它们。所有其他未跳过的行都必须复制到输出文件中。如果我使用 BufferedReader.nextLine(),如果下一行与输入模式不匹配,我将无法回溯到前一行。例如,如果我已经遇到一个A,并且下一行是另一个A(不是B),那么我必须将第一个A复制到输出文件,并从我没有处理的第二个A开始再次过滤,并检查下一行,依此类推。

我能想到的一种方法是首先保存输入文本文件的内容,这样如果它与我正在寻找的模式不匹配,我可以在遍历输入文件内容时轻松回溯。然而,这不是一个内存明智的解决方案。有没有什么聪明的算法来解决这个问题,最好是一次性遍历,即 O(N) 复杂度?或者,如果这是不可能的,那么仍然是内存方面的最佳解决方案是什么?一些示例 C/Java 代码将会非常有帮助。

最佳答案

您可以使用 3 元素数组来完成此操作。

每当遇到 A 时,检查数组的第一个元素是否为空 - 如果不是,则将数组刷新到输出文件 - 然后将新的 A 存储到数组的第一个元素。

每当遇到 B 时,请检查数组的第二个元素是否为空但第一个元素已满 - 如果不是,则将数组与新的 B 一起刷新到输出文件。否则(即,如果第一个元素已满,但第二个元素为空)您将把新的 B 存储为数组的第二个元素。

对于 C,重复 B 的逻辑,递增 1:每当遇到 C 时,检查数组的第三个元素是否为空,但第二个元素是否已满 - 如果不是,则将数组刷新到输出文件与新的 C 一起。否则(即,如果第二个元素已满但第三个元素为空),您将把新的 C 存储为数组的第三个元素。

当您既没有遇到 A、B 也没有遇到 C 时,请将所有现有数组元素刷新到输出文件,然后将新行直接写入输出文件。

这里的主要技巧是,您定义显式规则来填充缓冲区数组的每个槽,并使用它来避免重新检查任何行匹配,同时将缓冲区刷新到输出并在中断时重置序列模式。

当然,您承认您的实际规则集有些复杂,但相同类型的方法应该有效。

关于Java:读取文件输入内容并在找到某些线条图案序列时对其进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com