2011-04-17 43 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

相关问题