我坚持从方法中的while循环中退出

时间:2013-08-02 23:01:58

标签: java arraylist while-loop infinite-loop

我正在编写程序,要求用户输入七个产品名称。

我尝试做的是,如果有重复,则重复该方法。

我使用while循环,但我卡住了。

如果我第一次放入a,b,c,d,e,f,g,方法结束并转到下一个方法。

但是如果我输入a,a,b,c,d,e,f,程序会重复相同的方法,即使我输入a,b,c,d,e,f,g,它也会进入无限循环。

这是我的代码。

在主....

    purchasedList.setShopList();

在purchaseList类中......

    public void setShopList() {
    Scanner keyboard = new Scanner(System.in);

    // print out description.
    System.out.println("\n- Only have one entry of any type in the item list.");
    System.out.println("- The name of items cannot be longer than 16 characters.");

    System.out.println("\nType seven products.");
    boolean sameNames = true;
    while (sameNames == true) {
        for (int i=0; i<7; i++) {
            String n = keyboard.nextLine();
            name.add(n);
            name.set(i,name.get(i).toUpperCase());
        }
        sameNames = checkName();
    }
}
// accessor.
public ArrayList<String> getShopList () {
    return name;
}
// check duplicate.
public boolean checkName() {

    Set<String> uniqueName = new HashSet<String>();

    boolean foundName = false;

    for (int i=0; i<7; i++) {
        if (!uniqueName.add(name.get(i))) { // check duplicate
            foundName = true;
        }
    }
    if (foundName == true) {
        System.out.println("※ There is a duplicate.  Try it again.");
        return true;
    } else {
        return false;
    }
}

我的checkName()方法很好,因为在我的上一个项目中它起作用了。

在我的上一个项目中,我将while循环放在main中,就像这样

    public static void main(String[] args) {

    PurchasedList purchasedList = new PurchasedList();

    .
    .
    .

    boolean sameNames = true;
    boolean tooLong = true;
    while (sameNames == true || tooLong == true) {
        System.out.println("\nType seven products.");
        purchasedList.setShopList();
        sameNames = purchasedList.checkName();
        tooLong = purchasedList.checkLength();
    }

但是这一次,因为我的教授希望我让所有操作都在一个方法内完成,所以我尝试修复。

我在过去8小时内尝试自己解决,但我无法得到解决方案。

请帮帮我。

谢谢。

2 个答案:

答案 0 :(得分:1)

添加此行。

 if (foundName == true) {
    System.out.println("※ There is a duplicate.  Try it again.");
  ->  name = new ArrayList<String>();
    return true;

现在你要在数组的末尾添加新名称,然后在数组的开头将它们设置为大写。

for (int i=0; i<7; i++) {
        String n = keyboard.nextLine(); //Say I type in g on my second try
        name.add(n); //This add g to the end of the array
        name.set(i,name.get(i).toUpperCase()); //And this sets name[0] to G.
    }

这意味着你的名字阵列越来越长,而不是重置。

答案 1 :(得分:0)

你有没有清理名称?看起来你只是不断添加它,所以之前的入口仍然在循环的下一轮。因此,如果您使用与之前相同的输入,则始终会有重复(顺序无关紧要)。

这种改变应该这样做:

while (sameNames == true) {
        name = newArrayList <String>();
        for (int i=0; i<7; i++) {
            String n = keyboard.nextLine();
            name.add(n);
            name.set(i,name.get(i).toUpperCase());
        }
        sameNames = checkName();
    }

每次都会创建新的名称 ArrayList。 (如有必要,垃圾收集器会处理旧的垃圾收集器。)如果名称已经在其他地方创建了,那么请考虑一下你是否确实需要它 - 据我所知,你用它来收集输入,这发生在方法setShopList()中,所以看起来你不需要它早于此。