gpt4 book ai didi

java - arraylist 没有在单独的循环方法中正确打印出来?应该归咎于包装类或循环?

转载 作者:行者123 更新时间:2023-11-29 05:57:40 31 4
gpt4 key购买 nike

对于我的项目,我有一个数组列表供用户在一种方法中输入他们想要的任何名称,只要它不停止。然后在一个单独的方法中,我刚刚输入的值必须再次调出,这样我就可以为每个名称输入更多信息。

例子:

  1. 输入姓名:
  2. 姓名:鲍勃
  3. 姓名:乔
  4. 姓名:停止这会触发另一种方法来提示更多信息:

  5. 鲍勃:输入年龄:输入地址:

  6. 乔:输入年龄:输入地址:

    但是,现在,arraylist 没有正确打印出来,我得到了某些名称的重复,而其他名称没有出现在第二种方法中。另外,第二种方法中的循环并没有结束。我输入了我输入的名称的信息,但我一直收到“名称:”提示,但没有实际的数组列表值。我怀疑我的循环有问题,但我不太清楚如何解决?我还认为问题可能与我如何使用包装器将值放入数组列表有关,但我不知道如何解决这个问题。

在第二种方法中,我尝试交换计数器变量以在第二种方法中使用单独的计数器来跟踪数组列表中的顺序,但它似乎没有什么不同。在第一种方法中,我尝试用不同的 boolean while 循环交换循环,直接向上 while (!input.equals("Stop")),前两个选项内的 for 循环计数器,if 循环,以及以上的一些组合。

这是我的代码

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's 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);

您似乎期望最后一条语句仅在 ID 不等于“停止”时执行,但实际上它总是要执行。与(比如说)Python 不同,空格在 Java 中是无关紧要的。如果你的语句被认为是一个 block ,你需要大括号:

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() - 但您总是增加循环,所以你永远不会终止。

关于java - arraylist 没有在单独的循环方法中正确打印出来?应该归咎于包装类或循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11428614/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com