将元素循环移位数组

时间:2015-12-05 22:58:55

标签: java arrays

我试图使用方法将数组的元素移位n(某个随机数)。困难在于使用末尾的元素交换数组开头的元素。到目前为止,这是我的代码。

提出的其他阵列问题与此不同。

public class Shifty {

    private int[] datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

    public Shifty() {
        datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    }

    public int shift(int position) {
        int tmp = 0;
        int[] tmp1 = new int[12];
        for (int i = 0; i <= 12; i++) {
            if (i < position) {

                  tmp1[12-position] = this.datas[i];

            } else {
                this.datas[i] = this.datas[i+1];
                            }
            for  (int j = 12-position; j <= 12; j++){
                this.datas[j] = tmp1[j];
            }
        }

        return position;
    }

    public void display() {
        System.out.println(Arrays.toString(this.datas));
        System.out.println();
    }
}

2 个答案:

答案 0 :(得分:2)

你可以很好地利用模数运算。

public void shift(int n) {
  int[] temp = new int[datas.length];
  for (int i = 0; i < temp.length; i++) {
    temp[i] = datas[(i + n) % temp.length];
  }
  datas = temp;
}

答案 1 :(得分:0)

由于您显然不需要进行转换并且可以使用临时数组,因此解决方案非常简单:

public class Shifty {

    private int[] datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

    public Shifty() {
        datas = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
    }

    public int shift(int position) {
        final int len = datas.length;
        int[] tmp = Arrays.copyOf(datas, position);
        System.arraycopy(datas, position, datas, 0, len - position);
        System.arraycopy(tmp, 0, datas, len - position, position);
        return position;
    }

    public void display() {
        System.out.println(Arrays.toString(this.datas));
        System.out.println();
    }
}

这仅适用于使用datas的合法下标的参数值进行切换的调用。如果您要处理负值或大于datas.length的值,则需要将position缩减到适当的范围。请注意,由于这是循环移位,因此您可以在此使用模运算,因为shift(position)shift(position * n*datas.length)应该为任何整数值n产生相同的结果。