2016-10-14 55 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