1

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

例子:

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

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

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

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

在第二种方法中,我尝试用第二种方法中的单独计数器交换计数器变量以跟踪数组列表中的顺序,但这似乎没有什么区别。在第一种方法中,我尝试用不同的布尔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);
    }
}
4

3 回答 3

2

第一种方法的批评

我还没有仔细看,但我强烈怀疑这是问题所在:

if(ID.equals("Stop"))
    breaker = true;
else
    buffer = new Directory(ID); 
    nameList.add(buffer); 

您似乎希望最后一条语句仅在 ID 不等于“停止”时执行,但实际上它总是会执行。与(比如说)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()- 但您总是在增加循环中的大小,因此您永远不会终止。

于 2012-07-11T08:35:54.940 回答
1
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方法应该是这样的

并且添加必须是 -

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-11T08:45:09.443 回答
0

考虑使用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-11T08:39:38.730 回答