arraylist не печатает правильно в отдельном методе для цикла? класс обертки или циклы?
для моего проекта у меня есть arraylist для пользователя, чтобы вводить любые имена, которые они хотят, одним способом, пока это не останавливается. то в отдельном методе значения, которые я только что ввел, должны быть вызваны снова, поэтому я могу ввести дополнительную информацию для каждого имени.
пример:
введите имена: имя: bob имя: joename: остановить этот триггер, чтобы вызвать дополнительную информацию:
bob: введите возраст: введите адрес:
joe: введите возраст: введите адрес:
Однако, сейчас, arraylist не распечатывается правильно, и я получаю повторы определенных имен, в то время как другие имена не отображаются во втором методе. Кроме того, цикл во втором методе не заканчивается. Я ввожу информацию для имен, которые я ввел, но я все время получаю приглашение с именем "name:" и не имеет фактического значения arraylist. Я подозреваю, что с моими петлями что-то не так, но я не совсем понимаю, как это исправить? Я также подумал, что, возможно, проблема связана с тем, как я использую оболочку для внесения значений в arraylist, но я не знаю, как это исправить.
во втором методе я попытался выполнить замену countervariable, чтобы отслеживать порядок в списке массивов с помощью отдельного счетчика во втором методе, но это, похоже, не имеет значения. В первом методе я попытался выполнить замену цикла с помощью другого цикла boolean while с прямой вверх (! Input.equals("Стоп")), счетчик циклов внутри предыдущих двух параметров, если циклы, и некоторая комбинация из вышеперечисленного.
вот мой код
Scanner console = new Scanner(System.in); private ArrayList<Directory> nameList;//i have to use object oriented programming to store values in the Directory Class public int i;
первый метод:
private void addName()
{
Scanner LocalInput = new Scanner(System.in);
Directory buffer = null;
String ID = null;
System.out.println("Enter Station Designations Below, Enter Stop to quit");
boolean breaker = false;
while(breaker ==false)
{
System.out.print("Name: ");
ID = (LocalInput.nextLine());
if(ID.equals("Stop"))
breaker = true;
else
buffer = new Directory(ID);
nameList.add(buffer);
}
}
второй метод:
private void getInfo()
{
Scanner LocalInput = new Scanner(System.in);
Directory buffer;
buffer = nameList.get(i);
double age; String address;
System.out.println("Enter Temperatures below...");
System.out.println("" + nameList.get(i));
for (i = 0; i < nameList.size(); i++)
{
System.out.println("Name: " + buffer.GetID()); //there a getter and setter in the Directory class
System.out.println( "Age:\t");
age = LocalInput.nextDouble();
System.out.print( "Address:\t");
address = LocalInput.nextLine();
buffer= new Directory(age, address);
nameList.add(buffer);
}
}
Критика первого метода
Я еще не пристально смотрел, но я сильно подозреваю, что это проблема:
if(ID.equals("Stop"))
breaker = true;
else
buffer = new Directory(ID);
nameList.add(buffer);
Кажется, вы ожидаете, что последний оператор будет выполняться только тогда, когда идентификатор не равен "Стоп", но на самом деле он всегда будет выполняться. В отличие от (скажем) Python, пробелы в Java не имеют значения. Если вы считаете, что вы являетесь блоком, вам нужны скобки:
if(ID.equals("Stop"))
breaker = true;
else {
buffer = new Directory(ID);
nameList.add(buffer);
}
Лично я бы поставил фигурные скобки вокруг обеих частей:
if (ID.equals("Stop")) {
breaker = true;
} else {
buffer = new Directory(ID);
nameList.add(buffer);
}
... и, вполне возможно, избавиться от некоторой несущественной buffer
переменной:
if (ID.equals("Stop")) {
breaker = true;
} else {
nameList.add(new Directory(ID));
}
Я также избавился бы от переменной breaker
и ограничил область ID
(изменив его имя, чтобы соответствовать нормальным соглашениям) в результате:
while (true) {
System.out.print("Name: ");
string id = LocalInput.nextLine();
if (id.equals("Stop")) {
break;
}
nameList.add(new Directory(ID));
}
Критика второго метода
На данный момент это действительно странно. Это совсем не ясно, где объявлена переменная i
, или почему вы только выбираете buffer
один раз или почему вы просто добавляете в существующий список, а не мутируете существующий объект. Я подозреваю, что ты действительно хочешь:
for (Directory entry : nameList) {
System.out.println("Name: " + entry.GetID());
System.out.println( "Age:\t");
double age = LocalInput.nextDouble();
entry.setAge(age);
System.out.print( "Address:\t");
String address = LocalInput.nextLine();
entry.setAddress(address);
}
Обратите внимание, что текущий цикл всегда будет продолжаться до тех пор, пока i
nameList.size()
равным nameList.size()
но вы всегда увеличиваете размер в цикле, так что вы никогда не закончите.
private void getInfo()
{
Scanner LocalInput = new Scanner(System.in);
double age; String address;
for (Directory name : nameList) {
System.out.println("Name: " + name .GetID());
System.out.println( "Age:\t");
double age = LocalInput.nextDouble();
name.setAge(age);
System.out.print( "Address:\t");
String address = LocalInput.nextLine();
name.setAddress(address);
}
}
метод get должен быть таким
и Add должно быть -
private void addName()
{
Scanner LocalInput = new Scanner(System.in);
Directory buffer = null;
String ID = null;
System.out.println("Enter Station Designations Below, Enter Stop to quit");
boolean breaker = false;
while(breaker ==false)
{
System.out.print("Name: ");
ID = (LocalInput.nextLine());
if(ID.equals("Stop"))
breaker = true;
else {
buffer = new Directory(ID);
nameList.add(buffer);
}
}
}
Подумайте об использовании ключевого слова break
, тогда вам не нужен флаг breaker
и ветка else
:
while(true)
{
System.out.print("Name: ");
ID = (LocalInput.nextLine());
if(ID.equals("Stop"))
break;
buffer = new Directory(ID);
nameList.add(buffer);
}
К сожалению, уже опубликовано...