Сравнение элементов 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");
}
}