Сравнение элементов ArrayList в цикле дает неожиданный результат? - PullRequest
0 голосов
/ 06 сентября 2018

Следующий код проверяет только первый элемент в 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 ]

0 голосов
/ 06 сентября 2018

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

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.

0 голосов
/ 06 сентября 2018

Проблема в том, что вы все время проверяете только первый элемент. Сразу после ввода вашего первого элемента (и прерывания цикла, пока (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");
             }
         }
0 голосов
/ 06 сентября 2018

Проблема в бесконечном цикле 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");
           }
        }
    }
0 голосов
/ 06 сентября 2018

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

while(true) {

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

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

...