-1

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

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

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

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

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

这是我的代码。

主要……

    purchasedList.setShopList();

在购买列表类...

    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 小时内自己解决它,但我无法得到解决方案。

请帮我。

谢谢你。

4

2 回答 2

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.
    }

这意味着您的名称数组越来越长,而不是重置。

于 2013-08-02T23:04:51.747 回答
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() 所以看起来你在这之前不需要它。

于 2013-08-02T23:05:41.343 回答