ArrayList添加导致内容变为重复

时间:2014-12-25 23:00:21

标签: java arraylist duplicates

我正在尝试创建一个基本的2D游戏引擎,当我尝试从保存加载时,存储这些图块的ArrayList最终会添加到它添加到它的最后一个图块的副本。

public IWorld loadWorld(Save save){
    FileInputStream in = save.getWorldInput();
    this.init();
    try {
        while(in.available() > 0){
            int id = FileUtil.readInt(in);
            System.out.println(TileRegistry.getTile(save.getTileName(id)).load(in, this));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    generated = true;
    for (Layer layer : getLayers()){
        System.out.println(Arrays.toString(layer.getTiles().toArray(new ITile[layer.getTiles().size()])));
    }
    return this;
}

addTile声明:

public void addTile(ITile tile){
    layers[tile.getLayer()].add(tile);
}

添加声明

private List<ITile> tiles = new ArrayList<ITile>();

public void add(ITile tile){
    tiles.add(0, tile);
}

这里使用addTile

public ITile load(FileInputStream in, World world) {
    this.world = world;
    x = FileUtil.readInt(in);
    y = FileUtil.readInt(in);
    loadAdditionalData(in, world);
    world.addTile(this);
    return this;
}

您可以在此处找到控制台输出 - http://pastebin.com/zfqF9upp

1 个答案:

答案 0 :(得分:0)

TileRegistry.getTile(save.getTileName(id))显然每次调用时返回相同的一个ITile对象,然后重复加载不同的值,然后将另一个引用添加到列表中。

确保您的TileRegistry提供了不同的ITile个对象。如果您显示您正在呼叫的地点new ITile(),将有助于解释。

P.S。 tiles.add(0, tile); ArrayList的速度很慢,因为每次在开头添加元素时,都必须将所有后续元素移动一个位置。在末尾添加元素(tiles.add(tile))会更快;或者,使用LinkedList,这通常不会更快,但可以有效地添加元素。