Цикл for с if, else не работает, так как он печатает раздел else if, даже если элемент находится в массиве

Я знаю, что цикл перебирает каждый элемент массива! Следовательно, он также распечатывает «Джон не найден» перед распечаткой его информации! Как мне просто распечатать его информацию без «Джон не найден»?

Это мой код:

public static void main(String[] args) {
    
    Scanner scanner = new Scanner(System.in);
    
    System.out.print("Number of members: ");       
    int number = scanner.nextInt();
    Member m[] = new Member[number];
    scanner.nextLine();
    
    for (int i = 0; i < number; i++) {
        System.out.print("Name & number:");
        String[] input = scanner.nextLine().split(" ", 2);
        m[i] = new Member(input[0], input[1]);
    }  
    
    System.out.println("Information Saved.\n");
    
    boolean condition = true;
    while (condition) {
        System.out.print("Search a name or type exit: ");
        String search = scanner.nextLine();
            
        for (int x = 0; x < m.length; x++) {
            if (search.equals(m[x].getName())) {
                System.out.print(search + "'s number is " + m[x].getTel() + "\n");
                break;
            } else if (search.equals("exit")) {
                condition = false;
                m[x].showAllMembers();
            } else if (!search.equals(m[x].getName())){
                System.out.print(search + "is not found.\n");
            }
        }
    }
}

Класс участника:

class Member {
    private String name, tel;
    
    public Member(String name, String tel ) { // Constructor
        this.name = name;
        this.tel = tel;
    }
    
    // Getter
    public String getName() {
        return name;
    }
      
    // Setter
    public void setName(String name) {
        this.name = name;
    }
    
    // Getter
    public String getTel() {
        return tel;
    }
          
    // Setter
    public void setTel(String tel) {
        this.tel = tel;
    }
    
    public void showAllMembers() {
        System.out.print("Name:" + name + ", Number:" + tel + "\n");
    }

Результаты:
After running it

Подсказка: если у вас есть массив из 100 элементов, сколько раз вы хотите вывести часть «не найдено»? И сколько раз потенциально будет выполняться ваше условие "else"? Кроме того, вам действительно нужно проверять «выход» на каждой итерации цикла?

Jon Skeet 10.04.2022 10:10

Спасибо за быстрый ответ! Должен ли я не использовать цикл for, а вместо этого использовать Switch? Я все еще не очень уверен..

kwon 10.04.2022 10:20

Я бы лично рефакторил это: поместил бы код "поиск человека" в свой метод и жить стало бы намного проще. Но нет, здесь оператор switch не поможет.

Jon Skeet 10.04.2022 10:21

Ооо да! Большое спасибо~~~ ^^

kwon 10.04.2022 10:33

Извините, вы имеете в виду поместить метод «поиск человека» в класс Member?

kwon 10.04.2022 10:40

Нет, я бы, наверное, до сих пор учился в том же классе, что и main.

Jon Skeet 10.04.2022 10:48
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
6
46
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я предполагаю, что вы можете сделать следующее:

public static void main(String[] args) {
    
    Scanner scanner = new Scanner(System.in);
    
    System.out.print("Number of members: ");       
    int number = scanner.nextInt();
    Member m[] = new Member[number];
    scanner.nextLine();
    
    for (int i = 0; i < number; i++) {
        System.out.print("Name & number:");
        String[] input = scanner.nextLine().split(" ", 2);
        m[i] = new Member(input[0], input[1]);
    }  
    
    System.out.println("Information Saved.\n");
    
    boolean condition = true;
    while (condition) {
        System.out.print("Search a name or type exit: ");
        String search = scanner.nextLine();
        
        if (search.equals("exit")) {
            condition = false;
            // method showAllMembers() should not exists in Member class, it'll be really better to migrate it to the separate method, because one single Member object shouldn't know anything about ALL members
            showAllMembers(m);
        }
        int memberNumber = -1;
        for (int x = 0; x < m.length; x++) {
            if (search.equals(m[x].getName())) {
                memberNumber = x;
                break;
            }
        }
        if (memberNumber != -1) {
            System.out.print(search + "'s number is " + m[memberNumber].getTel() + "\n");
        } else {
            System.out.print(search + "is not found.\n");
        }
    }
    
    public static void showAllMembers(Member members[]) {
        for (Member member : members) {
            System.out.println("Member name: " + member.getName() + ", number: " + member.getTel());
        }
    }
}

здесь ошибка: memberNumber = m[x];

kwon 10.04.2022 10:43

Извините, просто замените его на memberNumber = x;

Begging 10.04.2022 10:44

ах, спасибо, но я так и не понял, где использовать showAllMembers() :')

kwon 10.04.2022 11:14

лучше где-нибудь создать отдельный метод, но вне Member::class. Еще лучше создавать в классе Main, позвольте мне показать вам, как

Begging 10.04.2022 11:20

@kwon, пожалуйста, ознакомьтесь с моим обновленным ответом

Begging 10.04.2022 11:24

Вы можете исправить это, убрав условие не найдено из цикла for. Который будет печатать подробности, если имя было найдено, или печатать не найдено после завершения цикла for для итерации, а переменная «найдено» по-прежнему ложна.

public static void main(String[] args) {
    
Scanner scanner = new Scanner(System.in);

System.out.print("Number of members: ");       
int number = scanner.nextInt();
Member m[] = new Member[number];
scanner.nextLine();

for (int i = 0; i < number; i++) {
    System.out.print("Name & number:");
    String[] input = scanner.nextLine().split(" ", 2);
    m[i] = new Member(input[0], input[1]);
}  

System.out.println("Information Saved.\n");

boolean condition = true;
while (condition) {
    System.out.print("Search a name or type exit: ");
    String search = scanner.nextLine();
    boolean found = false;
    for (int x = 0; x < m.length; x++) {
        if (search.equals(m[x].getName())) {
            System.out.print(search + "'s number is " + m[x].getTel() + "\n");
            found = true;
            break;
        } else if (search.equals("exit")) {
            condition = false;
            m[x].showAllMembers();
    }
    if (!found) {
      System.out.print(search + "is not found.\n");
    }
}

}

Это не скомпилируется, так как 0 и 1 не являются допустимыми значениями для boolean. Кроме того, нет никакого объяснения, что сделало бы этот ответ не очень полезным, даже если бы он работал.

Jon Skeet 10.04.2022 10:22

это не сработало :'(, оно все еще показывает "Джон не найден", хотя я добавил

kwon 10.04.2022 11:17

Вы добавили "found = true;" в тогдашнем заявлении?

Nizan Ifrach 10.04.2022 12:12

Код слишком часто печатает сообщение «не найдено», потому что он печатает его каждый раз, когда он находит член, который не соответствует. Вы хотите напечатать его только тогда, когда вы достигли конца цикла for.

Лично я бы извлек код в метод, что означает, что вы можете просто вернуться, когда найдете член. Я бы также переместил код «проверить на выход» за пределы цикла for.

Таким образом, ваш цикл while будет выглядеть так:

// No need for a "condition" variable - just break when we've seen "exit"
while (true) {
    System.out.print("Search a name or type exit: ");
    String search = scanner.nextLine();
    if (search.equals("exit")) {
        break;
    }
    findMember(m, search);
}

И метод findMember будет выглядеть так:

// TODO: You might want to return the member you've found
private static void findMember(Member[] members, String name) {
    for (Member member : members) {
        if (name.equals(member.getName()) {
            // TODO: use string formatting here
            System.out.println(name + "'s number is " + member.getTel());
            return;
        }
    }
    System.out.println(name + " is not found.");
}

Другие вопросы по теме