2016-10-14 57 views
0
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中的第一项然后退出?我认为这个问题是在这条线在txt文件中多个字符串搜索(java)

,而((sCurrentLine2 = br2.readLine())!= NULL)

。我的列表中有超过5000个项目,如果它们存在于我的txt文件中,我需要对它们进行比较。如果我运行我的应用程序for循环只需要第一个项目。我应该如何修改我的代码才能正常工作?感谢您的任何帮助。

回答

0

任何人都可以给我建议为什么我的FOR循环仅使用 中的第一项我的id_linky_list a然后退出?

很简单,因为你读你的整个文件中循环while ((sCurrentLine2 = br2.readLine()) != null)当你第一次调用它已经看了这么br2.readLine()将返回null这是当i = 0下一个电话不会做任何事情作为文件内容。

我该如何修改我的代码才能正常工作?

您需要反转循环forwhile作为下一

while ((sCurrentLine2 = br2.readLine()) != null) 
{ 
    for (int i = 0; i < id_linky_list.size(); i++) 
    { 

为了获得更好的性能,可以考虑使用Set代替List来存储你的话,简单地检查一个给定词通过使用方法contains(object)而不是遍历您的List

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])); 
+0

'流线=文件.lines(file.toPath(),Charset.from(“windows-1250”));'而不是'linesOf'或'readAllLines'。 –

+0

@JoopEggen谢谢你,我从其他软件包导入了错误的'Files',更新了答案 – Saravana