2009-11-13 156 views
12

我有兩個陣列的國際象棋變體我正在編寫的Java ...我有一個控制檯版本到目前爲止代表董事會作爲一維數組(大小爲32),但我我正在爲它做一個圖形用戶界面,我希望它看起來像一個4x8的網格,所以我有一個2維數組的JPanels ...將二維數組索引轉換爲一維索引

問題是,是否有任何公式可以轉換數組[i ] [j]索引到數組[我]給了它一個4x8數組的事實?

回答

15

鑑於4列8行,則:

i = row * 4 + col 

編輯:我不好,沒人抓我的這個錯誤很明顯。但它實際上應該是row * 4 + col

row * 8 + col會在可能的索引中留下不必要的空白。

+0

我不能相信我沒有得到這樣的笑......我(I * 4)+ (我* 8)難怪這是出界,謝謝你! – Becky 2009-11-13 18:22:33

+0

非常歡迎。最近我學習了一個Tic Tac Toe遊戲,我不得不做同樣的事情。將過去的舉措存儲爲單一指數是提高效率的一個步驟。 – 2009-11-13 18:43:14

+0

我總是不斷回到這個答案,出於某種原因,我只是無法找到一種方法來記住這個方程'index = x + y * num_cols;'會很好地添加我們推斷它的方式! – vexe 2015-11-20 18:02:27

3

i*8+j(假設8橫向寬度)

8

2D陣列中的每一行都被放置在您的一維數組中。 i給出你所在的行,j給出列(該行到多遠)。所以如果你在ith行,你需要將i完整的行首尾相連,然後再附加j以獲得你的單個數組索引。

因此,這將是像
singleDimIndex = array[0].length * i + j

17

認爲它是這樣的:

你有一個數組,恰好是一個一個維數組,這真的是一個項目只是一個長期串聯的二維數組。

因此,假設您有一個尺寸爲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 

而且應該是這樣的

+1

太棒了!非常感謝您解釋如何達到配方! – teo 2012-08-25 19:41:48

+0

@邁克爾這是一個很好的解釋,甚至+1你可以請詳細說明這一點「所以,假設你正在訪問你的二維數組的第二行和第二列,那麼最終結果是3步(第一行)+第二行中的步數,或者3 + 2 = 5。因爲我們是基於零的索引,所以這是索引4。更好。更好地解釋它。 – 2014-11-30 05:37:39

0

您可以使用此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); 
    } 
} 

輸出:平等:真

+0

如果您的數組大於8,我不認爲這可行! – schwiz 2017-05-24 23:12:38