我有兩個陣列的國際象棋變體我正在編寫的Java ...我有一個控制檯版本到目前爲止代表董事會作爲一維數組(大小爲32),但我我正在爲它做一個圖形用戶界面,我希望它看起來像一個4x8的網格,所以我有一個2維數組的JPanels ...將二維數組索引轉換爲一維索引
問題是,是否有任何公式可以轉換數組[i ] [j]索引到數組[我]給了它一個4x8數組的事實?
我有兩個陣列的國際象棋變體我正在編寫的Java ...我有一個控制檯版本到目前爲止代表董事會作爲一維數組(大小爲32),但我我正在爲它做一個圖形用戶界面,我希望它看起來像一個4x8的網格,所以我有一個2維數組的JPanels ...將二維數組索引轉換爲一維索引
問題是,是否有任何公式可以轉換數組[i ] [j]索引到數組[我]給了它一個4x8數組的事實?
鑑於4列8行,則:
i = row * 4 + col
編輯:我不好,沒人抓我的這個錯誤很明顯。但它實際上應該是row * 4 + col
。
row * 8 + col
會在可能的索引中留下不必要的空白。
i*8+j
(假設8橫向寬度)
2D陣列中的每一行都被放置在您的一維數組中。 i
給出你所在的行,j
給出列(該行到多遠)。所以如果你在ith
行,你需要將i
完整的行首尾相連,然後再附加j
以獲得你的單個數組索引。
因此,這將是像
singleDimIndex = array[0].length * i + j
認爲它是這樣的:
你有一個數組,恰好是一個一個維數組,這真的是一個項目只是一個長期串聯的二維數組。
因此,假設您有一個尺寸爲5 x 3(5行,3列)的二維數組。我們想製作一維數組。您需要決定是否要按行或按列進行連接,對於此示例,我們會說連接按行進行。因此,每行都是3列長,所以你需要把你的一維數組看作是在3的「steps」中定義的。所以,你的一維數組的長度將是5 x 3 = 15,現在你需要找到接入點。因此,假設你正在訪問你的二維數組的第二行和第二列,那麼這將結束爲3步(第一行)+第二行的步數,或3 + 2 = 5.由於我們是從零開始的索引是-1,所以這將是在指數現在4.
的具體配方:
int oneDindex = (row * length_of_row) + column; // Indexes
所以,作爲上述一個例子會風up up
oneDindex = (1 * 3) + 1
而且應該是這樣的
太棒了!非常感謝您解釋如何達到配方! – teo 2012-08-25 19:41:48
@邁克爾這是一個很好的解釋,甚至+1你可以請詳細說明這一點「所以,假設你正在訪問你的二維數組的第二行和第二列,那麼最終結果是3步(第一行)+第二行中的步數,或者3 + 2 = 5。因爲我們是基於零的索引,所以這是索引4。更好。更好地解釋它。 – 2014-11-30 05:37:39
您可以使用此ArrayConvertor類將一維數組中的二維數組轉換回來。
請注意:將二維數組轉換爲正常數組只適用於矩陣。
public class ArrayConvertor {
static public int[] d2Tod1(int[][] array){
int[] newArray = new int[array.length*array[0].length];
for (int i = 0; i < array.length; ++i)
for (int j = 0; j < array[i].length; ++j) {
newArray[i*array[0].length+j] = array[i][j];
}
return newArray;
}
static public int[][] d1Tod2(int[] array, int width){
int[][] newArray = new int[array.length/width][width];
for (int i = 0; i < array.length; ++i) {
newArray[i/width][i%width] = array[i];
}
return newArray;
}
}
以及一些測試代碼:
public class JavaMain{
public static void main(String[] args) {
int[][] arr2D_1 = new int[4][8];
byte counter=0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 8; j++) {
arr2D_1[i][j] = counter++;
}
int[]arr1D = ArrayConvertor.d2Tod1(arr2D_1);
int[][] arr2D_2 = ArrayConvertor.d1Tod2(arr1D, 8);
boolean equal = true;
for (int i = 0; i < arr2D_1.length; i++)
for (int j = 0; j < arr2D_1[0].length; j++){
if(arr2D_1[i][j]!=arr2D_2[i][j]) equal=false;
}
System.out.println("Equal: "+equal);
}
}
輸出:平等:真
如果您的數組大於8,我不認爲這可行! – schwiz 2017-05-24 23:12:38
我不能相信我沒有得到這樣的笑......我(I * 4)+ (我* 8)難怪這是出界,謝謝你! – Becky 2009-11-13 18:22:33
非常歡迎。最近我學習了一個Tic Tac Toe遊戲,我不得不做同樣的事情。將過去的舉措存儲爲單一指數是提高效率的一個步驟。 – 2009-11-13 18:43:14
我總是不斷回到這個答案,出於某種原因,我只是無法找到一種方法來記住這個方程'index = x + y * num_cols;'會很好地添加我們推斷它的方式! – vexe 2015-11-20 18:02:27