2013-10-11 220 views
2

這聽起來像是一個家庭作業問題,但我發誓它不是。1D陣列到2D陣列映射

我想爲這個2D數組包裝類構建一個迭代器。我想如果我能夠解決這個問題,那麼我可以構建我的迭代器。

我從0開始本1D連續9點的整數數組,並在8

[0, 1, 2, 3, 4, 5, 6, 7, 8]

結束,我給兩個變量horizontal_size = 3vertical_size = 3

我想使這個陣列成2D陣列,horizontal_size,​​。爲簡潔起見,我們稱它們爲hv

,我想產生的結果是這樣的:

0 1 2 
3 4 5 
6 7 8 

考慮到一維數組中的值,它告訴我的指數,還給出hv,在這種情況下都是3。有沒有辦法在二維數組上生成索引?

例如,1D數組中的第一個元素爲0,它映射到array[0][0]。第二個元素是1,它映射到array[0][1]

我想通過做array1d[i] mod vertical_size可以得到垂直索引。

  for getting the vertical index ::: th 

0 = [0] [0] 0模3 = 0 1 = [0] [1] 1個模3 = 1 2 = [0] [2] 2模3 = 2

3 = [1] [0],等等... 4 = [1] [1] 5 = [1] [2]

6 = [2] [0] 7 = [ 2] [1] 8 = [2] [2]

但我不知道如何獲得水平索引。

回答

6

如果您的編程語言通過截斷實現整數除法,則水平索引由floor(i/v)給出,或者僅爲i/v

例如,地板(7/3)= 2,所以圖7是在第2行。

+0

我第一次沒有正確地閱讀你的答案,我想你說'我/ h'這是我試過的答案,但結果並不正確。我甚至沒有考慮用'v'來劃分。謝謝! – Rhs

+0

索引是i/v和i%v,或者i/h和i%h,取決於你如何選擇它們,如果h = v就像這裏你不能分辨 – Joni

+0

我原來有東西是5通過2.我剛剛發佈了3作爲一個簡單的例子。正確的anaswer是floor(i/v) – Rhs

4

在Java這是工作的解決方案。請注意0​​是mod函數。

public static void main(String[] args) throws IOException { 
    int[] oneD = {1,2,3,4,5,6}; 
    int w = 3; 
    int h = 2; 
    int[][] twoD = new int[h][w]; 
    int[] oneDReversed = new int[oneD.length]; 

    for (int i = 0; i < h; i++) { 
     for (int j = 0; j < w; j++) { 
      twoD[i][j] = oneD[i*w+j]; 
     } 
    } 

    for (int i = 0; i < w*h; i++) { 
     oneDReversed[i] = twoD[(i/w)][(i%w)]; 
    } 
} 

爲什麼twoD[i][j] = oneD[i*w+j]?因爲你有循環週期做「對每一行i selet所有collumns j,它給人以array[num_of_rows][num_of_columns]由equaliation:row*width + column

保留的手段:爲四捨五入index devide number_of_columnsrow進行計時。 column是分配相同變量(mod)的其餘部分。

+1

我認爲海報要求相反的方向:一個單一的循環遍歷2D數組。 – phimuemue