Java中循环迭代数组次数过多

4

我正在开发一个Java项目,用于排序物品。然而,在我的代码中,循环遍历一些标记化的术语并将它们分配给自定义Items类中的值似乎不起作用。
代码:

public void tokenizeTerms(String content) {
        String[] tokenizedTerms = content.split(" ");
        Item[] itemArray = new Item[tokenizedTerms.length/3];
        Item fillItem = new Item();
        fillItem.setName("fillItem");
        fillItem.setPrice(0.00);
        fillItem.setQuantity(1);
        Arrays.fill(itemArray, fillItem);
        int currToken = 0;
        for(int i = 0; i < itemArray.length; i++) {
            itemArray[i].setName(tokenizedTerms[currToken]);
            currToken++;
            try {
                int foo = Integer.parseInt(tokenizedTerms[currToken]);
                itemArray[i].setQuantity(foo);
                currToken++;
                double moo = Double.parseDouble(tokenizedTerms[currToken]);
                itemArray[i].setPrice(moo);
                currToken++;
            } catch (Exception e) {
                System.out.println("Error parsing data.");
            }

        }
        this.items = itemArray;
    }

物品类别:

public class Item {
    private String name;
    private int quantity;
    private double price;

    public void setName (String name) {
        this.name = name;
    }
    public String getName () {
        return this.name;
    }
    public void setQuantity (int quantity) {
        this.quantity = quantity;
    }
    public int getQuantity () {
        return this.quantity;
    }
    public void setPrice (double price) {
        this.price = price;
    }
    public double getPrice () {
        return this.price;
    }
}

当我运行tokenize terms方法并打印itemArray中每个项的值时,我会得到一组看起来像这样的项目。
名称:书籍 数量:14 价格:856.89
名称:书籍 数量:14 价格:856.89
名称:书籍 数量:14 价格:856.89
然而,我知道这不应该发生,因为String[] tokenizedTerms看起来像这样:
[CD, 32, 459.2, T-Shirt, 22, 650.8, Book, 14, 856.89]
1个回答

5
问题出在你对数组的初始化上。你在数组中重复引用了同一个Item实例:
    Item fillItem = new Item();
    ...
    Arrays.fill(itemArray, fillItem);

您应该将不同的Item实例放置在数组的每个索引中:

for(int i = 0; i < itemArray.length; i++) {
    itemArray[i] = new Item ();
}

我只是为了填充数组,以便在后面调用设置器时不会出现空引用异常。 - Will Fisher
@WillFisher 但这是错误的初始化。这意味着所有的setter调用都会更新同一个“Item”实例。这就是为什么你在数组的所有索引中看到相同的值。 - Eran
我明白你的意思了,已经让它正常工作了。真不敢相信我被这个问题难住了那么久...谢谢!我会在可以的时候接受答案。 - Will Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接