通过调用函数更新带有结果数组的数组

时间:2016-11-23 15:36:10

标签: java arrays

我试图在将原始数组作为参数提供给函数后用结果数组更新数组。我不知道如何实现这一目标。我还没有涵盖所有材料,我需要你的帮助。所以我想要实现的目标:

原始数组:[1,2,3,4,5,6]
n = 3 其中n是数组元素向右移动的次数
移位阵列:[4,5,6,1,2,3]

我创建了一个移位1个位置的方法。我有另一种方法来切换N个位置,我将方法切换为1个位置。它将数组切换一次,但后来我无法使用移位结果更新原始数组。所以不要得到:

Original array: [1, 2, 3, 4, 5, 6]
RIGHT SHIFT:    [6, 1, 2, 3, 4, 5]
RIGHT SHIFT:    [5, 6, 1, 2, 3, 4]
RIGHT SHIFT:    [4, 5, 6, 1, 2, 3]  --> **final result** <br>

我明白了:

Original array:   [1, 2, 3, 4, 5, 6]
RIGHT SHIFT:      [6, 1, 2, 3, 4, 5]
RIGHT SHIFT:      [6, 1, 2, 3, 4, 5]
RIGHT SHIFT:      [6, 1, 2, 3, 4, 5]

我的代码:

public class Shift {

public static int[] rotate(int[] seq){
    int[] origArr = seq;
    int[] shiftedArrR = new int[seq.length];

    for (int i = 0, j = i+1; j < origArr.length; i++, j++) {
        shiftedArrR[j] = origArr[i];
    }
    shiftedArrR[0] = origArr[origArr.length-1]; 

    System.out.print("RIGHT SHIFT:  ");
    System.out.println(java.util.Arrays.toString(shiftedArrR));
    return shiftedArrR;
}

public static void rotate(int[] seq, int times){

    System.out.println(java.util.Arrays.toString(seq));
    int[] temp = new int[seq.length];

    for (int i = 1; i <= times; i++) {
        temp = rotate(seq);
    }
}


// ------------ MAIN METHOD ----------------
public static void main(String[] args) {

    System.out.print("Original array:   ");
    rotate(new int[]{1,2,3,4,5,6}, 3);
    }

}

显然,旋转(seq)的结果未分配给提供给rotate()方法的seq,而该方法应该将其移位更多次。 我知道这很简单,我尝试了不同的方法来解决这个问题,但没有运气。

5 个答案:

答案 0 :(得分:2)

您在3次迭代中使用未更改的数组(seq)而不是此处更改的数组(temp)

for (int i = 1; i <= times; i++) { temp = rotate(seq); }

答案 1 :(得分:2)

您正在调用rotate(int[] seq)方法正确的次数,但每次传入原始未经修改的&#39; seq&#39;数组,而不是前一轮的输出。

此外,当您使用int[] temp = new int[seq.length];创建临时数组时,您实际上从未对您创建的新数组执行任何操作 - 它永远不会被读取,并且只是替换为由其返回的另一个新数组(shiftedArrR)旋转方法..

解决此问题的一种方法就是抛弃temp数组,并用seq = rotate(seq);替换循环内的行。

另一种方法是修改原始的rotate方法,使其实际覆盖传入的数组的内容,而不是返回一个新的数组。

答案 2 :(得分:1)

public static void rotate(int[] seq, int times){

    System.out.println(java.util.Arrays.toString(seq));
    for (int i = 1; i <= times; i++) {
        seq = rotate(seq);
    }
}

用此代码替换您的rotate方法。你总是用旋转(seq)旋转相同的数组。因为你将它保存在temp中你有问题用seq而不是temp调用方法。因此将for循环的内容更改为seq = rotate(seq);。这会将第二个旋转方法的输出保存在您再次传递给方法

的数组中

答案 3 :(得分:1)

主要是在每次迭代中使用未更改的数组而不是更改的数组。

你的rotate(int [] seq)函数看起来也很混乱。所以我稍微更新一下。[以最简单的方式]。也无需创建额外的临时变量来存储数组。

 public class RightShift {

    public static void rotate(int[] seq){

        int temp = seq[seq.length - 1];

        for(int i = seq.length -1 ; i>0; --i)
            seq[i] = seq[i-1];

        seq[0] = temp;

        System.out.println("RIGHT SHIFT:  ");
        System.out.println(java.util.Arrays.toString(seq));
    }   

    public static void rotate(int[] seq, int times){

        System.out.println(java.util.Arrays.toString(seq));

        for (int i = 1; i <= times; i++) {
             rotate(seq);
        }
    }


    // ------------ MAIN METHOD ----------------
   public static void main(String[] args) {

        System.out.print("Original array:   ");
   //    rotate(new int[]{1,2,3,4,5,6});
        rotate(new int[]{1,2,3,4,5,6}, 3);
        }
}

答案 4 :(得分:0)

与大多数人提到的一样,阵列没有发生变异。无论如何,更简单的方法是只编写一种旋转方法

import java.util.Arrays;

public class Shift {
    public static int[] rotate(int[] seq, int times){
        int temp = 0;
        int round = 0;
        while (round <times) {
            for(int i=0;i<seq.length;i++) {
                if(i == seq.length-1) {
                    seq[seq.length-1] = temp;
                    break;
                }
                if(i == 0) 
                    temp = seq[i];
                seq[i]=seq[i+1];
            }
            round++;
        }
        System.out.println("Rotated array: " +Arrays.toString(seq));
        return seq;
    }

    // ------------ MAIN METHOD ----------------
    public static void main(String[] args) {
        int[] original = new int[]{1,2,3,4,5,6};
        System.out.println("Original array:   " + Arrays.toString(original));
        rotate(new int[]{1,2,3,4,5,6}, 3);
        }
}