BufferedReader br2 = new BufferedReader(
new InputStreamReader(new FileInputStream(id_zastavky), "windows-1250")
);
for (int i = 0; i < id_linky_list.size(); i++)
{
while ((sCurrentLine2 = br2.readLine()) != null)
{
String pom = id_linky_list.get(i);
String[] result = sCurrentLine2.split("\\|");
if((result[1].toString()).equals(pom.toString()))
{
System.out.println(result[1].toString()+" " +pom.toString() + " " + result[3]);
}
}
}
br2.close();
嘿伙计们。任何人都可以给我建议为什么我的FOR循环只使用我的id_linky_list中的第一项然后退出?我认为问题出在这一行
while((sCurrentLine2 = br2.readLine())!= null)
。我的列表中有超过5000个项目,如果它们存在于我的txt文件中,我需要对它们进行比较。如果我运行我的应用程序,for循环只需要第一项。我应该如何修改我的代码以使其正常工作?谢谢你的帮助。
答案 0 :(得分:1)
在for循环的第一次迭代期间,将读取整个文件,br2.readLine()
将始终为下一次迭代返回null。
如果文件大小很小,你可以构建一个地图,然后你可以使用该地图检查内容
File file = new File("filename");
List<String> lines = Files.linesOf(file, Charset.defaultCharset());
Map<String, List<String>> map = lines.stream().collect(Collectors.groupingBy(line -> line.split("\\|")[1]));
List<String> id_linky_list = null;
for (int i = 0; i < id_linky_list.size(); i++) {
if (map.get(id_linky_list.get(i)) != null) {
//sysout
}
}
<强>更新强>
Map<String, List<String>> text = Files.lines(file.toPath(), Charset.forName("windows-1250")).collect(Collectors.groupingBy(line -> line.split("\\|")[1]));
答案 1 :(得分:0)
任何人都可以给我建议为什么我的FOR循环只使用第一项 我的id_linky_list然后退出了吗?
只是因为您在第一次调用它时在循环while ((sCurrentLine2 = br2.readLine()) != null)
中读取了整个文件,而i = 0
下次调用时将无效,因为文件内容已被读取br2.readLine()
将返回null
。
我应该如何修改代码才能使其正常工作?
您需要将循环for
和while
反转为下一个
while ((sCurrentLine2 = br2.readLine()) != null)
{
for (int i = 0; i < id_linky_list.size(); i++)
{
要获得更好的效果,请考虑使用Set
代替List
来存储您的单词,并使用方法contains(object)
检查某个单词是否存在,而不是迭代{ {1}}。