как правильно получить каждую строку, содержащую определенное слово в Java

#java #file #java.util.scanner

#java #файл #java.util.scanner

Вопрос:

Я пытаюсь написать программу, которая считывает файл и проверяет каждую строку, содержащую определенное слово, а затем печатает его. если его нет, он должен напечатать «нет соответствия для вашего поиска».это то, что у меня есть до сих пор, и у меня возникли проблемы с объединением всего этого. после всех моих размышлений и замены while на if или помещения второго оператора if за пределы while, иногда не имеет значения, что я ввожу, всегда говорится «нет соответствия для вашего поиска», а иногда говорится java.util.NoSuchElementException: Строка не найдена. и иногда он зависает, и я искал это, и он говорит, что это ошибка в cmd или что-то в этом роде.любая помощь будет оценена, и я новичок в Java, поэтому, пожалуйста, любая вещь, которую вы можете мне посоветовать, будет полезна и оценена

 System.out.println("search for book");
 
String search = scan.next();    
scan.nextLine();    

File file = new File("library.txt");
Scanner in = null;
in = new Scanner(file);
          
String line = in.nextLine();
while(in.hasNext()) {
    if(line.contains(search)) {
        System.out.println(line);
    }   
           
    if(!line.contains(search)) {
        System.out.println("no match for your search");
        System.exit(0);
    }
}
  

Комментарии:

1. String line=in.nextLine(); должно быть внутри while цикла.

2. @Johnny Mopp да, изначально это было, но я пытался найти решение и… да, но спасибо, я бы, наверное, забыл и потратил еще 2 дня на то, чтобы разобраться

3. @Johnny Mopp но разве это не даст «не удается найти символ» в строке строки??

4. Вы могли бы использовать a, boolean found = false который устанавливается ( found = true;) при нахождении слова. Затем измените последнюю часть на if (!found) {System.out.println("no match for your search");}

5. @Джонни Мопп , спасибо тебе .

Ответ №1:

Не говоря уже о логических ошибках в вашем коде, вам, вероятно, следует создать логическую (логическую) переменную вне цикла и установить для нее значение false . Если вы столкнулись с вашим условием, установите его в true . После цикла while проверьте значение. Если это значение равно false, это означает, что строки не были найдены, и вы должны распечатать свое сообщение.

Пример:

 boolean foundAnything = false;
while(...) {
    ...
    if(condition) {
        foundAnything = true;
        ...
    }
    ...
}

// Nothing was found
if(!foundAnything) {
    ...
}
  

Ответ №2:

иногда не имеет значения, что я ввожу, там всегда написано «не соответствует вашему запросу».

Самая большая проблема здесь — это эта часть внутри вашего цикла:

 while(in.hasNext()) {
    if(line.contains(search)) {
        System.out.println(line);
    }   
           
    if(!line.contains(search)) {
        System.out.println("no match for your search");
        //HERE!!!
        System.exit(0);
    }
}
  

System.exit(0) остановит программу, и больше ничего выполняться не будет. Таким образом, если search слово не найдено в строке, программа завершается.

иногда он говорит java.util.NoSuchElementException: Строка не найдена

Вы читаете первую строку перед циклом, и, возможно, у вас есть пустой файл.

 File file = new File("library.txt");
Scanner in = null;
in = new Scanner(file);

//this reads the first line of the file
String line = in.nextLine();
while(//rest of code...
  

Вы можете преодолеть эти две проблемы с помощью:

  • Считывайте содержимое файла только в цикле
  • Используйте флаг, чтобы проверить, было ли найдено слово
  • Останавливайте цикл только в том случае, если слово было найдено или если в файле больше нет строк
  • В цикле, если слово еще не найдено, просто позвольте ему продолжаться
  • Избегайте использования System#exit , если это действительно не необходимо
  • Если после завершения цикла слово не было найдено, выведите сообщение

Учитывая эти предложения, ваш код может быть разработан следующим образом:

 File file = new File("library.txt");
Scanner in = new Scanner(file);

//Use a flag to check if the word was found 
boolean found = false;

//Stop the loop only if the word was found OR if the file has no more lines
while (!found amp;amp; in.hasNextLine()) {
    //Read the contents of the file only in the loop
    String line = in.nextLine();
    if (line.contains(search)) {
        found = true;
        System.out.println(line);
    }
    //In the loop, if the word is not found yet, just let it continue
}
//If after the loop the word was not found, print a message
if (!found) {
    System.out.println("no match for your search");
}
  

Комментарии:

1. но почему он внезапно читает только первую строку

2. Что вы имеете в виду? Ведет ли себя код внизу подобным образом?

3. нет, я, э-э, говорил об этом. тот, что внизу, работает, но что заставляет этот работать по-другому?

4. Ну, в коде, которым вы поделились, вы открываете сканер, а затем сразу же читаете первую строку. Я объяснил это в части «Вы читаете первую строку перед циклом, и, возможно, у вас есть пустой файл»

Ответ №3:

Прежде всего, вы, кажется, пропускаете свою первую строку. Во-вторых, второе предложение if является избыточным.

 Boolean found=false;
while(in.hasNext()) {
    String line = in.nextLine();
    if(line.contains(search)) {
        System.out.println(line);
        found=true;
    }           
}

if(found==false) System.out.println("no match for your search");