答案: 感謝您的幫助!和大多數人一樣,解決方案是創建一個新的2d int數組,然後複製舊數組中的值。這是我所做的功能,然後我可以將新板添加到散列表中,作爲一個新的密鑰。將新密鑰放入HashMap替換現有的不同密鑰
void newboard(){
NewBoard = new int[N][N];
for(int n = 0; n < N; n++){
for(int i = 0; i < N; i++){
NewBoard[n][i] = CurrentBoard[n][i];
}
}
}
的問題:
我有下面的代碼,即把一個3×3的板與一個整數列表,具體地(F,G,H)到一個HashMap沿。董事會CurrentBoard
是一個未解決的8難題。
public static HashMap<int[][], List<Integer>> map = new HashMap<>();
map.put(CurrentBoard, fgh);
我初始化了散列圖,對於剩餘的程序我想遍歷地圖來獲取我需要的板。在'0
'位置被移動後,地圖的每個條目都將是8拼圖板的特定狀態。
這是我的做法。 'cv'變量只是選擇具有最低「f」值的電路板(鍵)。
for(Map.Entry<int[][], List<Integer>> mapentry : map.entrySet()) {
if (cv > mapentry.getValue().get(0)) {
cv = mapentry.getValue().get(0);
CurrentBoard = mapentry.getKey();
fgh = mapentry.getValue();
}
}
現在,我已經在「CurrentBoard
」變量得到了一局,我想移動「0
」一行。所以,我調用此函數:
void moveUp(){
NewBoard = CurrentBoard;
memory = NewBoard[ZeroPositionX][ZeroPositionY - 1];
NewBoard[ZeroPositionY- 1][ZeroPositionX] = 0;
NewBoard[ZeroPositionY][ZeroPositionX] = memory;
}
然後我做了幾個(這個問題)不重要的檢查,並重新計算fgh
值這個NewBoard
。
然後我繼續使用
map.put(NewBoard, fgh);
我的問題放在與fgh
值到hashmap
沿NewBoard
是,這個替換HashMap中的當前密鑰。換句話說,不是向hashmap添加鍵和值,而是替換已經存在的鍵和值。我已經嘗試打印新紙板和當前紙板,以確保它們不同。
當我打印 hashmap
它只給我最新的條目。換句話說,董事會以及移動'0
'後的數值。
for(Map.Entry mapentry : map.entrySet()){
System.out.println(mapentry);
}
爲什麼添加新鍵和價值hashmap
不行?
Endnote:我是Java新手,所以其中一些可能不是最優的。如有必要,我會盡力詳細解釋。
看起來像你並不真的創建一個新的數組,但改變現有數組中的一些值。然而,這很難說。還要注意''int [] []'既不會覆蓋equals或'hashCode',這意味着如果您使用的鍵不在地圖中(同一個實例),您將無法找到該值。 – fabian
你需要克隆你的電路板, –
除了@ fabian的評論之外,在類中包裝'int [] []'並重寫'hashCode'以使用類似'java.util.Arrays.deepHashCode( yourArray)'。對於equals,你可以使用:'java.util.Arrays.deepEquals(thisArray,thatArray)' –