arraylist在单独的循环方法中没有正确打印出来?包装类或循环责备?

时间:2012-07-11 08:34:17

标签: java arraylist

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

示例:

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

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

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

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

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

    这是我的代码

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

3 个答案:

答案 0 :(得分: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() - 但您总是增加循环中的大小,因此您永远不会终止。

答案 1 :(得分: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); 
        }
    }
}

答案 2 :(得分: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); 
}

抱歉已发布...