先講重點好了,你可以這樣做:
// 你的 Array_chess_map 我用 mapList (純粹減少文字長度而已)
// chess_map 我用 arr_map
int[][] copyOfMap = new int[13][];
for(int x=0;x<arr_map.length;x++){
copyOfMap[x]=arr_map[x].clone();
}
mapList.add(copyOfMap);
如同 ssccg 所言,造成這個的原因是 java array 的特性:
int[][] a=new int[2][2];
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
a[1][1]=4;
原理其實是長這個樣子:
┌──────┐
┌────→│a[0][0] = 1 │
┌────┐ │ ├──────┤
a ──→ │ a[0] ─┼─┘ │a[0][1] = 2 │
├────┤ └──────┘
│ a[1] ─┼─┐
└────┘ │
│
│ ┌──────┐
└─→│a[1][0] = 3 │
├──────┤
│a[1][1] = 4 │
└──────┘
而非 C 語言中的這樣:
┌──────┐
│a[0][0] = 1 │
├──────┤
│a[0][1] = 2 │
├──────┤
│a[1][0] = 3 │
├──────┤
│a[1][1] = 4 │
└──────┘
所以當你執行 int[][] b = a.clone 時,他是把 a[0] 和 a[1]
的值 ==> 也就是指向 a[0][0~1] 和 a[1][0~1] 的 reference
複製到 b[0] 和 b[1]:
┌──────┐
┌────→│a[0][0] = 1 │
┌────┐ │ ├──────┤
a ──→ │ a[0] ─┼─┘ │a[0][1] = 2 │
├────┤ └──────┘
│ a[1] ─┼─┐
└────┘ │ ↑
│ │ ┌────┐
│ ┌──────┐ └─┼─ b[0]│←── b
└─→│a[1][0] = 3 │ ├────┤
├──────┤ ←─┼─ b[1]│
│a[1][1] = 4 │ └────┘
└──────┘
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.254.16.222
※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1442400188.A.698.html
※ 編輯: darkk6 (122.254.16.222), 09/16/2015 18:50:59