2015-12-14 51 views
3

我有一個包含數值的二維數組。示例如下:將二維數組移至左邊的循環

 
010101 
101010 
010101 

我想要創建一個循環,將這些值向左移動,如下例所示。

 
101010 
010101 
101010 

使「脫落」的元素,以結束後變爲。我很難在代碼中解決這個問題。

任何人有任何建議?

到目前爲止,我已滾動,但我不知道如何獲取脫落回去的元素。

這是我到目前爲止所。

for (int row = 0; row < array.length; row++) { 
    for (int col = 0; col < array[row].length; col++) { 
     if (!(row >= array.length) && !(col >= array[row].length - 1)) { 
      array[row][col] = array[row][col + 1]; 
     } 
    } 
} 
+0

如果你沒有使用數組,你可以使用一個LinkedList,只是刪除就完了第一節點和大頭釘它。 – Kylar

回答

3

嘗試使用模運算符:

arrayShifted[row][col] = array[row][(col + 1) % array[row].length]; 

刪除您的條件檢查爲好。另外請注意,爲避免覆蓋值,您需要將結果存儲在新數組中。

for (int row = 0; row < array.length; row++) { 
    for (int col = 0; col < array[row].length; col++) { 
     arrayShifted[row][col] = array[row][(col + 1) % array[row].length] 
    } 
} 
+0

我試過了你的建議,但它沒有把「脫落」的元素放回去。我只是做了我上面的例子。 – Lithicas

+0

@Lithicas查看我的編輯。 – whiskeyspider

+0

謝謝!很棒。現在我必須解釋這個算法確實做了什麼:p乾杯! – Lithicas

0

這裏是一個完整的方法,該方法以點到每一行移位的可變量的和正確處理複製相同的元件在模量的方法。

public void shiftArray(int[][] array, int shift) { 

    for (int row = 0; row < array.length; row++) { 
     int rowLength = array[row].length; 

     // keep shift within bounds of the array 
     shift = shift % rowLength; 

     // copy out elements that will "fall off" 
     int[] tmp = new int[shift]; 
     for (int i = 0; i < shift; i++) { 
      tmp[i] = array[row][i]; 
     } 

     // shift like normal 
     for (int col = 0; col < rowLength - shift; col++) { 
      array[row][col] = array[row][col + shift]; 
     } 

     // copy back the "fallen off" elements 
     for (int i = 0; i < shift; i++) { 
      array[row][i + (rowLength - shift)] = tmp[i]; 
     } 
    } 
} 

測試運行

int[][] array = new int[][] { 
    {0,1,0,1,0,1}, 
    {1,0,1,0,1,0}, 
    {0,1,0,1,0,1} 
}; 

shiftArray(array, 1); 

for (int[] row : array) { 
    for (int col : row) { 
     System.out.print(col); 
    } 
    System.out.println(); 
} 

// 101010 
// 010101 
// 101010