2017-03-09 88 views
0

我正在开发一款游戏,并注意到向两个阵列列表添加一个对象,然后更新其中一个对象并不会更新其他对象。有没有可能解决这个问题?将相同的对象添加到多个阵列列表

我有一个所有的瓷砖列表,虽然渲染时是循环的。但我也想在我的库存类中插入一列插槽(扩展Tile),而不是通过所有游戏切片循环来获取库存插槽。

我有两个列表:Game.tiles和Inventory.slots

这是我补充的槽(Inventory类):

for(int i = 0; i< 16; i++){ 
Slot slot = new Slot(); 
Game.tiles.add(slot); 
slots.add(slot); 
} 

而这正是我修改插槽(Inventory类):

for(int i = 0; i< 16; i++){ 
slots.get(i).visable = false; 
} 

问题是数据更新槽列表中的槽而不是Game.tiles列表中的同一槽。

完整清单类:http://pastebin.com/KS5BNB3F

+0

添加相同实例同时数组列表? – nbokmans

+1

nope ...如果对象相同,那么你在每个列表中都有它的引用....修改列表A中的对象将影响唯一的一个实例...发布代码 –

+0

告诉我们你在做什么... –

回答

-1

创建一个对象实例,将其添加到两个阵列。然后这些数组将具有相同的引用。这意味着更新你的对象会导致它在两个数组中更新。

1

当您将对象添加到两个不同的ArrayList时,实际上只添加对该对象的引用。因此,如果您修改对象,它将同时反映在两个列表中。请看下面的代码片段:

public class Clazz{ 
    private Integer d = 0; 
    public static void main(String[] args) throws Exception { 
     Clazz obj = new Clazz(); 
     List<Clazz> list1 = new ArrayList<Clazz>(); 
     List<Clazz> list2 = new ArrayList<Clazz>(); 
     list1.add(obj); 
     list2.add(obj); 
     obj.d = 15; 
     System.out.println(list1.get(0).d); //prints 15 
     System.out.println(list2.get(0).d); //prints 15 
    } 
} 
+0

我已经改变的代码本,但它仍然似乎不工作:'用于(INT I = 0; I <16;我++){ \t \t \t插槽时隙=新时隙(100 +(I * 64 ),900,真); \t \t \t Game.tiles.add(slot); \t \t \t slots.add(slot); \t \t}我做错了什么? – MCrafterzz

+0

您正在为'Game.tiles'和'slots'添加16个不同的'Slot'对象。假设您修改槽对象5,它将反映在这两个列表中。这不是和你一起发生的吗? – VHS

+0

没有不幸的不是。也许这是第一个列表是瓦片,第二个是插槽?如果我编辑Game.tiles列表,然后它影响渲染,但不是如果我更改插槽列表。编辑:我测试了System.out.println(Game.tiles.get(i + 2).visable +“,”+ slots.get(i).visable);他们真的有不同的数据(+2,因为有两个其他瓷砖) – MCrafterzz