处理java中的ArrayLists ... arraylist的所有成员都自行更新?

时间:2010-03-27 00:54:54

标签: java arraylist

我有一个功能,一旦采取了一些食物,缩小了“食物银行”(在我的GUI中用矩形表示)的大小。我有以下功能检查:

public boolean tryToPickUpFood(Ant a)
    {
        int xCoord = a.getLocation().x;
        int yCoord = a.getLocation().y;
        for (int i = 0; i < foodPiles.size(); i++)
        {
            if (foodPiles.get(i).containsPoint(xCoord, yCoord))
            {
                foodPiles.get(i).decreaseFood();
                return true;
            }
        }
        return false;
    }

其中decreaseFood缩小矩形..

public void decreaseFood()
    {
        foodAmount -= 1;
        shrinkPile();
    }

    private void shrinkPile()
    {
        WIDTH -=1;
        HEIGHT = WIDTH;
    }

但是,每当一个矩形缩小时,所有矩形都会缩小。为什么会这样?

编辑:

正在添加食物堆:

addFoodPile(new Food(new Point(200,200)));
addFoodPile(new Food(new Point(400,340)));

public void addFoodPile(Food fp)
    {
        foodPiles.add(fp);
    }

4 个答案:

答案 0 :(得分:3)

因为阵列的每个元素都有相同的食物堆?如果您正在填充它

FoodPile foodPile = new FoodPile();
for (int i = 0; i < count; i++) {
    foodPiles.add(foodPile)
    }

你应该这样做:

for (int i = 0; i < count; i++) {
    FoodPile foodPile = new FoodPile();
    foodPiles.add(foodPile)
    }

另外,这个循环:

for (int i = 0; i < foodPiles.size(); i++)
{
    if (foodPiles.get(i).containsPoint(xCoord, yCoord))
    {
        foodPiles.get(i).decreaseFood();
        return true;
    }
}
如果使用foreach语法,

可以更具可读性:

for (FoodPile foodPile : foodPiles)
{
    if (foodPile.containsPoint(xCoord, yCoord))
    {
        foodPile.decreaseFood();
        return true;
    }
}

答案 1 :(得分:2)

这可能是你的问题 -

private void shrinkPile()
{
    WIDTH -=1;
    HEIGHT = WIDTH;
}

在标准Java命名约定中,所有大写名称都用于静态变量 - 因为你没有显示它们的声明,我不能确定 - 但它肯定是可疑的并且是一个值得关注的地方。

答案 2 :(得分:0)

我猜你以为你在List中添加了很多单独的堆,但实际上你一遍又一遍地添加对同一个堆的引用。检查你的部分代码。

答案 3 :(得分:0)

根据您显示的代码,问题似乎在于tryToPickUpFood()的使用位置和频率。除非你使用了相同的foodPiles参考,正如其他答案所指出的那样