2011-04-17 36 views
0

我試圖寫其遍歷的陣列,並且當它找到一個特定類型的值,將它向右移動一個限定的位置數的函數。移一個陣列元件環繞

我知道如何通過臨時存儲的值,右側的元素轉移到左邊,然後寫在正確的位置的臨時值到切換元件。

我掙扎位是如果某些字符顯示在靠近陣列我需要它來回繞,從陣列開始不斷的結束,所以是圓形的。

我基本上是在尋找一些指導如何得到這個釘

所以數組轉移,例如,大寫字母向右3位和特殊字符向左1位:

{ M, y, N, a, m, e, P} becomes... 
{ y, M, P, a, N, m, e} 

要如果8顯示從該陣列的端部早於3個元素,並且不會繞到8的元素向右移位3位我有如下所述,但是這僅適用。

輸入數組:

{0, 1, 2, 3, 4, 5, 6, 7, **8**, 9} 

所需的輸出:

{0, **8**, 1, 2, 3, 4, 5, 6, 7, 9} 

int[] array = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 

for (int i = array.Length - 1; i >= 0; i--) 
{ 
    if (array[i] == 8) 
    { 
     int temp = array[i]; 
     int j = 0; 
     for (j = i; j < i + 3; j++) 
     { 
      array[j] = array[j + 1]; 
     } 
     array[j] = temp; 
    } 
} 

如果任何人都可以給我一些指點我怎麼能做到這一點,將是巨大的!

+0

究竟是什麼問題? – Oded 2011-04-17 19:03:28

+0

它延續到我需要幫助的陣列的開始位置,所以如果元素需要向右移動出現爲倒數第二個元素,並且需要向右移動三個元素,則它將以第二個元素結束數組 – MarkJW 2011-04-17 19:07:20

回答

2

只需使用模運算,以便在您移位時不是寫入索引j處的元素,而是寫入索引爲j % array.Length的元素。因此:

public void FindAndShift<T>(T[] array, T value, int shift) { 
    int index = Array.IndexOf(array, value); 
    int shiftsRemaining = shift; 
    for(int currentPosition = index; shiftsRemaining > 0; shiftsRemaining--) { 
     array[currentPosition % array.Length] = array[(currentPosition + 1) % array.Length]; 
    } 
    array[(index + shift) % array.Length] = value; 
} 

我已排除錯誤檢查。

+0

這似乎工作,非常感謝你。我甚至沒有想過使用模數。謝謝 – MarkJW 2011-04-17 19:28:28

0

你可以用一個if語句做到這一點,檢查是否有足夠的空間陣列結束前,如果它是不是你算算多少步在陣列藏漢的開始轉變。

我也認爲你可以通過計算位置模數的長度來進行移位,我現在不能嘗試它,但我腦海中的邏輯說它應該起作用。

+0

的元素,如果在你的腦袋的邏輯就像是一個傑森說,那麼它確實工作:)謝謝 – MarkJW 2011-04-17 19:29:15

相關問題