如何移动一个数组元素?

时间:2011-04-17 19:00:52

标签: c# arrays shift circular-buffer

我正在尝试编写一个遍历数组的函数,当它找到某种类型的值时,它会将它向右移动一定数量的位置。

我知道如何通过临时存储值来移动元素,将右侧元素向左移动,然后将临时值写入正确的位置。

我正在努力的一点是,如果某个字符出现在数组的末尾附近,我需要将它环绕并从数组的开头继续,所以它是圆形的。

所以一个数组移位,例如,大写字母到右边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;
    }
}

2 个答案:

答案 0 :(得分: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;
}

我已排除错误检查。

答案 1 :(得分:0)

您可以使用if语句执行此操作,检查数组末尾之前是否有足够的空间,如果不是,则必须计算在数组开头移位的步数。

我也认为你可以通过计算当你进行移位时模数阵列长度的位置来做到这一点,我现在无法尝试,但我头脑中的逻辑说它应该可以工作。