【发布时间】:2018-03-10 11:44:12
【问题描述】:
我是 Java 新手。我正在尝试遍历几个 .txt 文件以将文件的一行与第二个文件的每一行进行比较。这是我的两个文件:listread.txt 和 csvread.txt。
这是我正在使用的代码:
try {
BufferedReader csvReader = new BufferedReader(new FileReader("/data/csvread.txt"));
BufferedReader listReader = new BufferedReader(new FileReader("/data/list.txt"));
String csvItem, listItem;
int count =0;
while((csvItem = csvReader.readLine()) != null){
System.out.println("before second loop:"+csvItem);
while ((listItem = listReader.readLine())!= null) {
System.out.println("list Item: "+listItem.toLowerCase().split("¬")[1]);
System.out.println("csv Item: "+csvItem.toLowerCase());
if(listItem.toLowerCase().split("¬")[1].contains(csvItem.toLowerCase())){
count++;
}
}
}
}catch(Exception e){
e.printStackTrace();
}
当我运行它时,只有csvread.txt 中的第一行(存储在变量csvItem 中)与listread.txt 中的所有行进行比较。这是一个示例输出:
before second loop:Record Category
list item: provisions
csv Item: record category
list item: request category
csv Item: record category
list item: elevator
csv Item: record category
list item: assessment
csv Item: record category
list item: associates
csv Item: record category
list item: score
csv Item: record category
list item: attachments
csv Item: record category
它只遍历list.txt 文件的所有行以及csvread.txt 文件的第一行。没有移动到csvread.txt 的第二行,程序结束在最后抛出一个错误:
java.lang.ArrayIndexOutOfBoundsException: 1
at test.main(test.java:52)
指的是System.out.println("list item: "+listItem.toLowerCase().split("¬")[1]);这一行。这个声明与我猜的迭代无关。不知道为什么会抛出这个错误..
但是,当我注释掉第二个 for 循环时,它可以很好地迭代 csvread.txt 文件中的所有行。这是一个示例输出,只有第一个 while 循环和第二个循环被注释掉:
before second loop:Record Category
before second loop:Type
before second loop:Name
before second loop:State
before second loop:Number
before second loop:ID (Self)
before second loop:Parent
before second loop:Title
仅当存在嵌套循环时才会出现此问题。当有一个循环时,完全没有问题。有人可以对这种奇怪的行为有所了解吗?还有怎么克服呢?
编辑:
我添加了一个if 条件来检查该行是否包含¬,因为我在该字符上拆分该行:
if(listItem.contains("¬")){
System.out.println("list item: "+listItem.toLowerCase().split("¬")[1]);
System.out.println("csv Item: "+csvItem.toLowerCase());
if(listItem.toLowerCase().split("¬")[1].contains(csvItem.toLowerCase())){
count++;
}
}
不,我不再遇到异常。但是,行为仍然很奇怪。这是添加if后的输出:
before second loop:Record Category
list item: provisions
csv Item: record category
list item: request category
csv Item: record category
list item: elevator
csv Item: record category
list item: assessment
csv Item: record category
list item: associates
csv Item: record category
list item: score
csv Item: record category
list item: attachments
csv Item: record category
before second loop:Type
before second loop:Name
before second loop:State
before second loop:Number
before second loop:ID (Self)
before second loop:Parent
before second loop:Title
其他元素现在在csvread.txt 中被迭代,但与listread.txt 中的行的比较除了第一个元素外没有增加。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
您有一行没有
¬,因此它不会被拆分,并且数组没有索引为1的元素。从解决这个问题开始。 -
此外,在第一次迭代中,内部循环读取到 list.txt 文件的末尾,因此
listReader指向文件的末尾。在下一次外循环迭代中,由于listReader已经指向文件的末尾,因此内循环不会被执行。 -
那么,它是这样工作的吗?我如何让它重新开始?有没有更好的迭代方式? @AndrewS
标签: java loops while-loop