在Java中按索引和值移动元素

时间:2015-11-17 00:23:43

标签: java

我需要编写一个代码,将元素移到右边的k个位置,元素是索引位置。此外,我应该假设我的数组列表以圆圈形式链接。

示例:

list = [1,2,3,4]; 
list.shiftRight(1,2); 
list = [1,3,4,2]

对于圆圈列表,我想到:

list = [1,2,3,4]; 
list.shiftRight(2, 3); 
list = [1,3,2,4].

这是我的代码,但它无法正常工作。

public void shiftRight(int index, int k) throws ArrayIndexOutOfBoundsException{

    if (index < 0 || index > this.list.size())
        throw new ArrayIndexOutOfBoundsException();

    if (k + index > this.list.size()) {
        int element = this.list.remove(index);
        this.list.add(this.list.size() - k, element);

    } else {
        int element = this.list.remove(index);
        this.list.add(k + index , element);

    }

    //System.out.println("ShiftedRight " + this.list);

}

此处还有用于向左移动元素的代码,这些代码也不起作用。 ^ _ ^

public void shiftLeft(int index, int k) throws ArrayIndexOutOfBoundsException {

    if (index < 0 || index > this.list.size())
        throw new ArrayIndexOutOfBoundsException();

    if (k + index > this.list.size()) {
        int element = this.list.remove(index);
        this.list.add(this.list.size() - k + index, element); 
    } else {
        int element = this.list.remove(index);
        this.list.add(index - k, element);
    }

    //System.out.println("ShiftedLeft " + this.list);

}

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。有一些边缘条件需要考虑。你必须非常小心索引,长度和一个人。

首先请注意,在4个元素的列表中,有效索引为[0..3]。也就是说,最大索引比长度小一个。

其次,k似乎是无限的。我认为这意味着非负面的。如果是这样,你应该检查一下。它可以比列表的长度大许多倍,即。你可以循环不止一次。所以我们使用模运算。

第三,当您从列表中删除元素时,索引会更改。重新添加元素时需要处理此问题。

public void shiftRight(int index, int k)
    throws ArrayIndexOutOfBoundsException
{
    int length = this.list.size();
    // Note: index cannot be equal to length. You were testing for >.
    if ((index < 0) || (index >= length))
    {
        throw new ArrayIndexOutOfBoundsException('out of range index: ' + index);
    }
    int shift = k % length; // Use modulo arithmetic to determine a shift in the range [0..length).
    if (shift == 0)
    {
         return; // No change, we're done.
    }
    int newIndex = (index + shift) % length; // Calculate where to move to, again using modulo arithmetic, to get the loop around.
    int element = this.list.remove(index);
    this.list.add(newIndex, element);
}

我只是亲自测试了这个,所以请告诉我是否有任何问题。 shiftLeft()应该类似,但要注意模运算中的负数。