【问题标题】:The first while loop of the nested loop iterates only once嵌套循环的第一个 while 循环只迭代一次
【发布时间】:2018-05-14 09:35:53
【问题描述】:

在这里比较两个 .txt 文件,如果第二个文件中的任何字符串在第一个文件中匹配或重复,则结果是第一个文件的行号。

在代码中,第一个 while 循环只迭代一次。

 Scanner scanner = new Scanner(firstFile);
 Scanner scanner1 =new Scanner(secondFile);
 int lineNum = 0;
 while (scanner.hasNextLine())  
  {
        String line = scanner.nextLine();
        lineNum++;
        while (scanner1.hasNextLine()) 
        {
               String line1 = scanner1.nextLine();
               if(line.contains(line1)) 
                { 
                  System.out.println("Ignore/Review line number: "+lineNum);      
                }
        }
  }             

【问题讨论】:

  • 我会使用BufferedReader 甚至LineNumberReader 而不是Scanner 来读取行。实际上,根据文件大小,我会考虑读取至少一个完整文件并将其行存储在 List 中,以避免必须为另一个文件的每一行读取它...
  • 保存列表中的第二个文件似乎是一个不错的选择。我会试试的,谢谢。

标签: java string while-loop iteration nested-loops


【解决方案1】:

您必须在外部while 循环内创建第二个文件的Scanner

Scanner scanner = new Scanner(firstFile);
int lineNum = 0;
while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    lineNum++;
    Scanner scanner1 =new Scanner(secondFile);
    while (scanner1.hasNextLine()) {
        String line1 = scanner1.nextLine();
        if(line.contains(line1)) { 
            System.out.println("Ignore/Review line number: "+lineNum);      
        }
    }
} 

否则scanner1.hasNextLine() 在外部while 循环的第二次迭代中返回false,因为在外部循环的第一次迭代中已经读取了整个第二个文件。

【讨论】:

  • 我现在明白了。感谢您让我明白这一点。
【解决方案2】:

此问题与第二个 while 循环从未取消有关。因此,当您在文件 2 中找到匹配行时,您会继续将文件 1 的行与文件 2 中的所有其他行进行比较。您可能想要的是这样的:

if(line.contains(line1)) 
{ 
    System.out.println("Ignore/Review line number: "+lineNum);
    break;
}

在此之后,您可以继续比较文件 1 的下一行和文件 2 的下一行。

【讨论】:

  • 感谢您的回答。我不是在比较第二行和第二行。一次将整个文件与另一个文件的一行进行比较,然后迭代该行(另一个文件)。我的答案很明确。
【解决方案3】:

第二个文件的Scanner 在外部文件的第一个循环期间读取整个文件并到达文件末尾(下一个外部while循环没有可读取的内容)。您应该在外部 while 循环的主体中创建第二个 Scanner,以使其在外部循环的每个开始处从头开始读取所选的第二个文件。

【讨论】:

    最近更新 更多