2015-11-07 3 views
0

Я в начале класса программирования и, похоже, испытываю серьезную проблему при поиске текстового файла. Что мой код должен делать, основываясь на уступки:Сканер только ищет первую строку .txt-файла

  • Accept вход, в этом случае имя и место, что ввод в текстовый файл
  • Позволяет пользователю искать имя, или его часть имя и вернуть все строки с соответствующим текстом.

У меня есть входная часть задания, и я нахожусь на грани завершения части поиска, но мой код выполняет поиск только первой строки .txt-файла. Я могу распечатать все строки .txt-файла, и если я ищу имя в строке 1 файла .txt, он правильно напечатает строку. Моя проблема возникает, когда я искал название, которое не находится на линии 1. Ниже мой код:

System.out.println ("Would you like to retrieve names from your index? (YES/NO)"); 
try 
{ 
    retrieve=input.readLine(); 
    } 
    catch (IOException E) 
    { 
    System.out.println(E); 
    } 
    } 
if (choice == 2 && retrieve.equalsIgnoreCase("YES") || retrieve.equalsIgnoreCase("Y")) 
    { 
    while (retrieve2.equalsIgnoreCase("YES") || retrieve2.equalsIgnoreCase("Y")) 
    { 
    FileReader reader = new FileReader("Name_Index.txt"); 
    BufferedReader bufferedReader = new BufferedReader(reader); 
    String line = bufferedReader.readLine(); 

    System.out.println ("Enter a string of characters in which to search by or enter \"all names\" f$ 
    search_term = gatherInput(); 

    System.out.println("Search results include: "); 
    ArrayList<String> list = new ArrayList<String>(); 
    Scanner inFile = new Scanner (new File("Name_Index.txt")); 
    inFile.useDelimiter(","); 

    while (inFile.hasNextLine()) 
    { 
     list.add(inFile.nextLine()); 
    } 
    Collections.sort(list);  
    if (search_term.equalsIgnoreCase("all names")) 
    { 
     for (String temp : list) 
     { 
     System.out.println(temp); 
     } 
    } 
    else if (line.toLowerCase().contains(search_term.toLowerCase())) 
    { 
     System.out.println(line);  
     bufferedReader.close(); 
    } 
System.out.println("End!"); 
    System.out.println ("Would you like to retrieve names from your index? (YES/NO)"); 
    try 
    { 
    retrieve2=input.readLine(); 
    } 
    catch (IOException E) 
    { 
    System.out.println(E); 
    } 
    } 
    System.out.println("Thank you, come again!"); 
    } 
}  
    public static String gatherInput() 
    { 
    Scanner scan = new Scanner(System.in); 
    String user_input = scan.nextLine(); 
    return user_input; 
    } 
    } 

Я попытался расширить время (inFile.hasNextLine()) цикл, чтобы включать в себя второй " if ", тем не менее, создает проблему для поиска« все имена »- он возвращает весь список несколько раз (однако много строк находится в файле). Я даже попытался создать еще один while (inFile.hasNextLine()) цикл во втором выражении «if», и нет никакой разницы в результатах.

Я так расстроен на этом этапе, потому что я работаю над этим кодом уже более недели и просмотрел все мои заметки и записи лекций для этого задания без какой-либо помощи. Любое понимание было бы высоко оценено.

+0

Вы можете переформатировать вам код, чтобы отступ ясно? Кроме того, у вас есть таинственный '}' после первого блока catch ... что он закрывает? – Linus

+0

«все имена» дают вам правильный результат? Также вы не зацикливались с объектом «BufferedReader». – Blip

+0

@Blip Да. запрос «все имена» возвращает полный список. Тем не менее, в алфавитном порядке. – DeaLunae

ответ

1

Вы читаете только одна строка файла

String line = bufferedReader.readLine(); 

Почему вы не читаете все строки и хранить их в списке;

List<String> lines = new ArrayList<>(); 
String line = bufferedReader.readLine(); 
while(line != null){ 
    lines.add(line); 
    line = bufferedReader.readLine(); 
} 
bufferedReader.close(); 

Затем напечатать все строки, содержащие подстроку IGNORECASE:

lines.stream().filter(l -> l.toLowerCase().contains(search_term.toLowerCase)) 
.forEach(s -> System.out.println(s)); 
+0

Благодарим за помощь! Это действительно помогает мне, и я, наконец, начинаю понимать этот проект. Можете ли вы сообщить мне, что скрыто в операциях сгиба стрелки подстроки? При попытке компиляции я получаю следующую ошибку: 'Name_Index.java:146: незаконный запуск выражения lines.stream(). Filter (1-> l.toLowerCase(). Содержит (search_term.toLowerCase)) .forEach (s-> System' – DeaLunae

+0

lines.stream(). filter (l -> l.toLowerCase(). содержит (search_term.toLowerCase())) .forEach (s -> System.out.println (s)); Кажется, я забыл search_term.toLowerCase() скобки – Zpetkov

0

Вам нужно автоматического повтора readLine()

Например:

File f = new File(ruta); 
      if(!f.exists()) //Error 
      else { 
       @SuppressWarnings("resource") 
       BufferedReader br = new BufferedReader(new FileReader(f)); 
       String line; 
       while ((line = br.readLine()) != null) { 
         //line = the next line 
} 
} 
Смежные вопросы