将文本存储到String []然后将数组存储到Vector时出现问题

时间:2010-04-24 16:03:45

标签: java arrays

好的,对于背景我只使用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。}”等。是什么导致了这个奇怪的问题?所有帮助都非常感谢,如果您需要任何澄清,请告诉我。

3 个答案:

答案 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声明。