txt文件中的多字符串搜索(java)

时间:2016-10-14 17:20:33

标签: java loops comparison readline

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循环只需要第一项。我应该如何修改我的代码以使其正常工作?谢谢你的帮助。

2 个答案:

答案 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

  

我应该如何修改代码才能使其正常工作?

您需要将循环forwhile反转为下一个

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

要获得更好的效果,请考虑使用Set代替List来存储您的单词,并使用方法contains(object)检查某个单词是否存在,而不是迭代{ {1}}。