我正在编写程序,要求用户输入七个产品名称。
我尝试做的是,如果有重复,则重复该方法。
我使用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小时内尝试自己解决,但我无法得到解决方案。
请帮帮我。
谢谢。
答案 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()中,所以看起来你不需要它早于此。