ycwong99 Ответов: 2

Чтение текстового файла и возврат совпадения


when the user enter the year which is no exits in the text file, it will display no such records, but the no records statements are being display 4 times, which is the same with my with my total records in the text file. How to make the no records only display 1 time?



<pre> private static void searchForName() throws IOException {
        

   /* List<String> lines = Files.readAllLines(Paths.get("C:\\assignment\\student.txt"));
    for (String line : lines) {
        if (line.contains(name)) {
            System.out.println(line);
        }
    }


*/

    
}
}
}
    
class Utility
{
    static boolean numberOrNot(String input)
    {
        try
        {
            Integer.parseInt(input);
        }
        catch(NumberFormatException ex)
        {
            return false;
        }
        return true;
    }
}


Что я уже пробовал:

я стараюсь не записывать apper на 1 раз, а не Несколько же раз совпадает с моими итоговой записи в текстовый файл.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
но заявления об отсутствии записей отображаются 4 раза

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
-----
Совет: Научитесь правильно делать отступы в вашем коде, это покажет его структуру и поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
private static void searchForName() throws IOException {
    int choice=0;
    Scanner sc = new Scanner(System.in);


    System.out.println("_____________________________________________");
    System.out.println("                Filter                ");
    System.out.println("_____________________________________________");
    System.out.println("1 > Filter by Year.");
    System.out.println("2 > Filter by ID.");
    System.out.println("3 > Filter by Name.");
    System.out.println("4 > Filter by Course");
    System.out.println("5 > Exit");
    System.out.println("_____________________________________________");
    System.out.println("Please choose the number:");
    System.out.print(">");
    {
        choice = sc.nextInt();
        if (choice == 1)
        {
            System.out.println("  Please enter Year you wish to Filter   ");
            Scanner kb = new Scanner(System.in);
            String input = kb.nextLine();

            if(Utility.numberOrNot(input) && (input.length() == 4))
            {
                List<String> lines = Files.readAllLines(Paths.get("C:\\assignment\\student.txt"));
                for(String line:lines)
                {
                    if(line.contains(input))
                    {    System.out.println("Year                      Date                 Name");
                        System.out.println(line);
                        System.out.println("=============================================");
                    }
                    else{
                        System.out.println("No records");
                    }
                }
            }
            else
            {
                System.out.println("Sorry!!!!Please enter 4 digit integer...");
                searchForName();
            }
        }

        /* List<String> lines = Files.readAllLines(Paths.get("C:\\assignment\\student.txt"));
        for (String line : lines) {
        if (line.contains(name)) {
        System.out.println(line);
        }
        }
        */
    }
}
}

class Utility
{
    static boolean numberOrNot(String input)
    {
        try
        {
            Integer.parseInt(input);
        }
        catch(NumberFormatException ex)
        {
            return false;
        }
        return true;
    }
}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]


Рейтинг:
0

OriginalGriff

Просто: вы печатаете его в неправильном месте.
Если вы делаете отступы правильно, это гораздо более очевидно:

List<String> lines = Files.readAllLines(Paths.get("C:\\assignment\\student.txt"));
for(String line:lines){
   if(line.contains(input)){
      System.out.println("Year                      Date                 Name");
      System.out.println(line);
      System.out.println("=============================================");
   }
   else{
      System.out.println("No records");
   }
}
Каждый раз, когда вы обходите цикл, вы печатаете один из наборов строк: поэтому, если он соответствует первой строке, он будет печатать верхний, нижний и нижний колонтитулы.
Если он также совпадает со второй строкой, он напечатает верхний, нижний и нижний колонтитулы.
Если он не соответствует строке, он печатает "нет записей".
Так что вполне возможно, что ваш вывод может выглядеть следующим образом:
Year                      Date                 Name
1982                      1st Feb 1982         Mike Jones
=============================================
No records
Year                      Date                 Name
1982                      2nd Feb 1982         Jane Seymore
=============================================
No records
То, что вам нужно сделать, это:
1) имейте переменную вне цикла под названием "foundRow", заданную в false.
2) внутри петли, Если вы найдете совпадение, вы проверяете foundRow.
2.1) если это ложь, выведите заголовок.
3) независимо от этого, распечатайте строку и установите для параметра foundRow значение true.
4) обойти вокруг петли
5) после того как цикл закончен, проверьте foundRow еще раз
5.1) если это правда, распечатайте нижний колонтитул
5.2) если это ложь, выведите "нет записей".

Теперь это имеет смысл?


Maciej Los

5ed!