如何搜索分为两行的单词?

时间:2015-08-21 15:31:10

标签: java logic

我正在用java编写程序来搜索.txt文件中的单词列表(事务编号)。 .txt文件可以包含任意数量的行。

List<String> transactionList = new ArrayList<String>(
            Arrays.asList("JQ7P00049", "TM7P04797", "RT6P70037");
FileReader fileReader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(fileReader);
        try {
            String readLine = bufferedReader.readLine();
            for (String transactionIndex : transactionList) {
                if (readLine != null) {
                    if (readLine.contains(transactionIndex)) {
                        System.out.println(transactionIndex + ": true");
                        readLine = bufferedReader.readLine();
                    } else {
                        readLine = bufferedReader.readLine();
                    }
                }
            }
        }

程序运行正常,除非单词在两行之间分开,例如:

-------- JQ7P0
0049 ----------

这显然是因为bufferedReader逐行读取,并将搜索字符串与该行中的内容进行比较。

有没有办法处理这种情况?

3 个答案:

答案 0 :(得分:1)

正如durron597所提到的,你并没有循环遍历整个文件,但是这里的解决方案假设文件至少有2行,并且事务字符串不超过2行。

它将每一行与下一行连接起来,并在连接的行中搜索字符串。为防止同一笔交易被打印两次,我又添加了一张支票。

    List<String> transactionList = new ArrayList<String>( Arrays.asList("JQ7P00049", "TM7P04797", "RT6P70037") );
    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    try {
        // Search the first line
        String lastLine = bufferedReader.readLine();
        for (String transactionIndex : transactionList) {
            if (lastLine.contains(transactionIndex)) {
                System.out.println(transactionIndex + ": true");
            } 
        }
        String currentLine = null;

        // Search the remaining lines
        while((currentLine=bufferedReader.readLine()) != null) {
            String combined = lastLine + currentLine;
            for (String transactionIndex : transactionList) {
                if (currentLine.contains(transactionIndex) || (!lastLine.contains(transactionIndex) && combined.contains(transactionIndex))) {
                    System.out.println(transactionIndex + ": true");
                } 
            }
            lastLine = currentLine;
        }

    } catch ( Exception e ) {
        System.out.println( e.getClass().getSimpleName() + ": " + e.getMessage() );
    } finally {
        bufferedReader.close();
    }

答案 1 :(得分:1)

这个程序有第二个问题:你不会读取较长文件中的所有行,因为你没有循环遍历文件中的所有行。

也就是说,您可以通过一次读取两行并将它们合并在一起来完成此操作。

这是一个完整的计划:

private static final List<String> transactionList = new ArrayList<String>(Arrays.asList(
    "JQ7P00049", "TM7P04797", "RT6P70037"));

public static void main(String[] args) throws Exception {
  String filePath = "test.txt";

  FileReader fileReader = new FileReader(filePath);
  BufferedReader bufferedReader = new BufferedReader(fileReader);

  try {
    String firstLine = bufferedReader.readLine();
    String secondLine = bufferedReader.readLine();
    if (secondLine == null) {
      checkLine(firstLine);
    }
    do {
      String combinedLine = firstLine + secondLine;
      checkLine(combinedLine);
      firstLine = secondLine;
    } while ((secondLine = bufferedReader.readLine()) != null);
  } finally {

  }
}

private static void checkLine(String combinedLine) {
  for (Iterator<String> iterator = transactionList.iterator(); iterator.hasNext();) {
    String transactionIndex = iterator.next();
    if (combinedLine.contains(transactionIndex)) {
      System.out.println(transactionIndex + ": true");
      iterator.remove();
    }
  }
}

答案 2 :(得分:1)

您的代码似乎无法正确读取文件,而是读取与您正在寻找的交易号码一样多的行。假设这不是你想要的,我已经纠正了它。

另外,我假设一个交易号码最多可以跨越两行。

    List<String> transactionList = new ArrayList<String>(
                Arrays.asList("JQ7P00049", "TM7P04797", "RT6P70037"));
    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String[] lastLines = {"",""};
    try {
        String readLine;
        while((readLine = bufferedReader.readLine()) != null) {
            lastLines[0] = lastLines[1];
            lastLines[1] = readLine;
            String combinedLastLines;
            combinedLastLines = lastLines[0] + lastLines[1];
            for (String transactionIndex : transactionList) {
                if (combinedLastLines.contains(transactionIndex) && !lastLines[0].contains(transactionIndex)) {
                    System.out.println(transactionIndex + ": true");
                }
            }
        }
    }

一般的想法是始终组合两行,并查看交易号是否在那里。我们来看看代码:

String[] lastLines = {"",""};

这一行定义了一个数组,我们将用它来存储最近读取的两行。

while((readLine = bufferedReader.readLine()) != null) {

此代码段会读取与文本文件中一样多的行。

lastLines[0] = lastLines[1];
lastLines[1] = readLine;
String combinedLastLines;
combinedLastLines = lastLines[0] + lastLines[1];

此代码负责替换数组中最旧的行,并将当前的readLine推送到数组中。然后将最后两行合并为一个String!

if (combinedLastLines.contains(transactionIndex) && !lastLines[0].contains(transactionIndex)) {

这里我们正在搜索合并的行以查找交易号。但是:当交易号不跨越多行时,我们可能会意外地发现它两次。因此,第二项检查是为了确保我们之前没有找到交易。

希望这是你正在寻找的东西!