好的,对于背景我只使用Java一个多星期了,我正在制作一个基本的GUI“Recipe Book”应用程序,只是为了测试我学到的一些技术。目前我正在处理“添加新配方”页面,该页面允许用户通过一次添加一种配料来制作新配方。这些成分有3个属性:名称,数量和单位(如杯子,盎司等),分别来自两个文本字段和一个组合框。 3个值作为字符串存储到表示成分的String数组中,然后数组存储在一个向量中,该向量包含一个配方的所有成分。添加成分后,用户首先在空框/组合框下拉列表中输入3个必要值,然后单击“添加成分”。这是我点击按钮时的代码:
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source == addIngredientButton) {
//make sure 3 ingredient fields are not blank
if (!ingredientNameField.getText().equals("") && !ingredientAmountField.getText().equals("") && !ingredientUnitDropdown.getSelectedItem().equals("")) {
tempIngredientsArray[0] = ingredientNameField.getText(); //set ingredient name to first position in array
tempIngredientsArray[1] = ingredientAmountField.getText(); //set ingredient amount to second position in array
tempIngredientsArray[2] = (String) ingredientUnitDropdown.getSelectedItem(); //set ingredient unit to third position in array
int ingredientsVectorSize = tempRecipe.ingredientsVector.size();
tempRecipe.ingredientsVector.add(this.tempIngredientsArray); //why would it matter if this and previous statement were switched
for (int k = 0; k < ingredientsVectorSize + 1; k++ ) {
liveIngredientsListArea.append("\n" + tempRecipe.makeIngredientSentence(k));
System.out.println(Arrays.toString(tempIngredientsArray)); //shows that tempIngredientsArray gets messed up each time
}
}
现在这是我一直遇到的非常奇怪的问题。用户第一次添加配料一切正常。第二次,该成分的String []似乎是重复的,第三次是三重的。 Aka第一次运行System.out.println时可能返回“{Sugar,3,Cups}”,第二次返回“{Flour,2,Oz。} {Flour,2,Oz。}”等。是什么导致了这个奇怪的问题?所有帮助都非常感谢,如果您需要任何澄清,请告诉我。
答案 0 :(得分:2)
您的评论中的第一个问题:
int ingredientsVectorSize = tempRecipe.ingredientsVector.size();
tempRecipe.ingredientsVector.add(this.tempIngredientsArray);
//why would it matter if this and previous statement were switched
因为在第一行中你获得了Vector的大小,然后在下一行中添加一个元素。如果按相反的顺序执行此操作,则大小将增加1。
要回答您的主要问题,您需要循环添加成分。
for (int k = 0; k < ingredientsVectorSize + 1; k++ ) {
liveIngredientsListArea.append("\n" + tempRecipe.makeIngredientSentence(k));
System.out.println(Arrays.toString(tempIngredientsArray));
//shows that tempIngredientsArray gets messed up each time
}
每种成分的添加次数与ingredientsVector
中的元素(加1)相同。所以当你有一个空的载体时,第一种成分加一次,第二种成分加两次,依此类推。
只需添加每种成分而不循环,你应该没事。
答案 1 :(得分:2)
每次执行此操作
int ingredientsVectorSize = tempRecipe.ingredientsVector.size();
tempRecipe.ingredientsVector.add(this.tempIngredientsArray);
ingredientsVector
的大小增加一。该订单很重要,因为size()
会以不同的方式返回。
然后,
for (int k = 0; k < ingredientsVectorSize + 1; k++ ) {
liveIngredientsListArea.append("\n" + tempRecipe.makeIngredientSentence(k));
您附加了下一个项目ingredientsVectorSize
次。这就是重复的来源。
只需删除循环,每次附加一个项目,就可以了。
答案 2 :(得分:1)
我注意到了一些事情:
tempRecipe.ingredientsVector.add(this.tempIngredientsArray);
这会在您的向量中添加tempIngredientsArray
。阵列,就像那样。没有复制或其他任何东西。数组(单个对象)被添加到向量的末尾。如果现在将不同的值放入数组中,则它将包含不同的值。如果将新的,更改的数组添加到向量中,则向量中将使用相同的数组两次,使用最新的值,因为...它是相同的数组。
编辑:
我建议在if
:
if (!ingredientNameField.getText().equals("") ... {
String[] tempIngredientsArray = new String[3];
tempIngredientsArray[0] = ingredientNameField.getText();
...
...当然,你必须删除现在的tempIngredientsArray
声明。