arraylist не печатает правильно в отдельном методе для цикла? класс обертки или циклы?

48
6

для моего проекта у меня есть arraylist для пользователя, чтобы вводить любые имена, которые они хотят, одним способом, пока это не останавливается. то в отдельном методе значения, которые я только что ввел, должны быть вызваны снова, поэтому я могу ввести дополнительную информацию для каждого имени.

пример:

введите имена: имя: bob имя: joe

name: остановить этот триггер, чтобы вызвать дополнительную информацию:

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);
}
}

спросил(а) 2012-07-11T11:34:00+04:00 7 лет, 4 месяца назад
3
Решение
56

Критика первого метода

Я еще не пристально смотрел, но я сильно подозреваю, что это проблема:

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() но вы всегда увеличиваете размер в цикле, так что вы никогда не закончите.

ответил(а) 2012-07-11T11:35:00+04:00 7 лет, 4 месяца назад
Еще 2 ответа
45

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);
}
}
}

ответил(а) 2012-07-11T11:45:00+04:00 7 лет, 4 месяца назад
34

Подумайте об использовании ключевого слова break, тогда вам не нужен флаг breaker и ветка else:

while(true)
{
System.out.print("Name: ");
ID = (LocalInput.nextLine());
if(ID.equals("Stop"))
break;

buffer = new Directory(ID);
nameList.add(buffer);
}

К сожалению, уже опубликовано...

ответил(а) 2012-07-11T11:39:00+04:00 7 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема