2017-03-09 89 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