2016-10-14 2 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 a, после чего он завершает работу? Я думаю, что проблема в этой строкеНесколько строк поиска в txt-файле (java)

в то время как ((sCurrentLine2 = br2.readLine())! = NULL)

. У меня более 5 000 элементов в моем списке, и мне нужно сравнить их, если они существуют в моем txt-файле. Если я запустил приложение, цикл for займет только первый элемент. Как мне изменить свой код, чтобы он работал правильно? Спасибо за любую помощь.

ответ

0

Любой может дать мне совет, почему мой цикл FOR использует только первый элемент в my id_linky_list a затем он завершает работу?

Просто потому, что вы читаете весь файл в цикле 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) вместо повторения вашего 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 
     } 
    } 

Update

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 Спасибо, я импортировал неправильные «файлы» из другого пакета, обновленный ответ – Saravana

Смежные вопросы