Сравнение элементов ArrayList в цикле дает неожиданный результат?

Следующий код проверяет только первый элемент в ArrayList. Когда я набираю элемент, который находится в ArrayList, но не на первой позиции, я получаю сообщение об ошибке "Пожалуйста, введите правильное имя".

Как я могу это исправить? Спасибо!

Вот мой код:

   private ArrayList<Account> accounts = new ArrayList<>();

   for(Account a : accounts)
    {
        while(true)
        {
            System.out.printf("Customer name: ");
            String customerName = scanner.next();

            if(customerName.equals(a.getName()))
            {
                System.out.println("You entered " + a.getName());
                break;
            }
            else
            {
                System.out.println("Please enter a valid name");
            }
        }
    }   

4 ответа

Решение

Вы должны прервать время. Когда вы повторяете список, вы должны думать о логике. Это может быть как этот код;

ArrayList<Account> accounts = new ArrayList<>();
boolean isMatched = false;

while (true) {
    for (Account account : accounts) {
        System.out.printf("Customer name: ");
        String customerName = scanner.next();
        if (customerName.equals(account.getName())) {
            isMatched = true;
            break;
        }
    }
    if (isMatched) {
        System.out.println("You entered " + account.getName());
        break;
    }
    System.out.println("Please enter a valid name");
}

PS: boolean значение, когда найдено имя клиента для завершения цикла while.

Проблема в бесконечном цикле while.

while(true)

Этот цикл прерывается только тогда, когда customerName == firstElement.Nameиначе это бесконечный цикл. Вместо этого я думаю, что вы хотите попробовать переместить цикл while за пределы цикла for. Так что код будет выглядеть примерно так.

    private ArrayList<Account> accounts = new ArrayList<>();

    while(true)
    {
        System.out.printf("Customer name: ");
        String customerName = scanner.next();
        for(Account a : accounts){

           if(customerName.equals(a.getName())){
                 System.out.println("You entered " + a.getName());
                 break;
           }else{
            System.out.println("Please enter a valid name");
           }
        }
    }

Внутренний цикл делает это:

while(true) {

здесь нет цели Он просто продолжает цикл внутри внешнего цикла, поэтому всегда сравнивается с тем же a учетная запись!

В основном вы должны поменять местами две петли!

Проблема в том, что вы все время проверяете только первый элемент. Сразу после ввода вашего первого элемента (и прерывания вашего цикла в то время, как (1)) вы переходите ко второму.

Представьте, что у вас есть в вашем arrayList

"hello", "bye"

Вы будете внутри цикла до тех пор, пока не отправите сообщение первому элементу ("привет").

Решение:

 while(true)
         {
             System.out.printf("Customer name: ");
             String customerName = scanner.next();
             if (accounts.contains(customerName)){
                 System.out.println("You entered " + customerName);
                 break;
             }
             else{
                 System.out.println("Please enter a valid name");
             }
         }
Другие вопросы по тегам