For-loop覆盖数组一旦完成

问题描述 投票:0回答:3

在下面的代码中,我试图制作一个数组混洗器。这将按charArray指示的顺序对字符数组(runTimes)进行无序播放,将这些数组中的每一个存储在二维数组shuffledArrays中。问题是当程序完成for循环时,由于某种原因,它将所有数组设置为最后一个添加的数组。

感谢您的任何帮助,谢谢。

import java.util.Random;

public class Testing {

    public static void main(String[] args) {

        char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'}; //Array to be shuffled
        int runTimes = 3; //Amount of shuffled arrays to create

        char[][] shuffledArrays = new char[runTimes][charArray.length];;


        for (int x = 0; x != runTimes; x++) {
            shuffledArrays[x] = shuffleArray(charArray);

            System.out.print("IN FOR LOOP: shuffledArrays[" + x + "] = ");
            System.out.println(shuffledArrays[x]);
        }

        System.out.print("OUT OF FOR LOOP: shuffledArrays[0] = ");
        System.out.println(shuffledArrays[0]);

        System.out.print("OUT OF FOR LOOP: shuffledArrays[1] = ");
        System.out.println(shuffledArrays[1]);

        System.out.print("OUT OF FOR LOOP: shuffledArrays[2] = ");
        System.out.println(shuffledArrays[2]);

    }

    private static char[] shuffleArray(char[] array) {
        Random rand = new Random();

        for (int x = 0; x < array.length; x++) {
            int randomIndexToSwap = rand.nextInt(array.length);

            char temp = array[randomIndexToSwap];

            array[randomIndexToSwap] = array[x];

            array[x] = temp;
        }

        return array;

    }

}
java arrays for-loop shuffle
3个回答
1
投票

[而不是更改原始数组,而是需要更改数组的副本,例如]

private static char[] shuffleArray(char[] inArray) {
    Random rand = new Random();
    char[] array = inArray.clone();
    for (int x = 0; x < array.length; x++) {
        int randomIndexToSwap = rand.nextInt(array.length);
        char temp = array[randomIndexToSwap];
        array[randomIndexToSwap] = array[x];
        array[x] = temp;
    }
    return array;
}

示例运行:

IN FOR LOOP: shuffledArrays[0] = dcfaeb
IN FOR LOOP: shuffledArrays[1] = edcbaf
IN FOR LOOP: shuffledArrays[2] = bfaced
OUT OF FOR LOOP: shuffledArrays[0] = dcfaeb
OUT OF FOR LOOP: shuffledArrays[1] = edcbaf
OUT OF FOR LOOP: shuffledArrays[2] = bfaced

1
投票

因为您总是返回SAME数组,所以最后一个数组会影响所有数组。您需要返回副本或通过副本,例如:

private static char[] shuffleArray(char[] array) {
    Random rand = new Random();

    for (int x = 0; x < array.length; x++) {
        int randomIndexToSwap = rand.nextInt(array.length);

        char temp = array[randomIndexToSwap];

        array[randomIndexToSwap] = array[x];

        array[x] = temp;
    }

    return Arrays.copyOf(array, array.length);
}

0
投票

您观察到相同数组的三个状态。 for循环的第一次迭代的System.out.println()语句显示第一个状态,例如在此时f, b, c, e, a, d。然后,第二次迭代将再次对同一数组进行混洗,例如a, e, b, f, c, d。第三迭代idem dito。

现在shuffledArrays[0]shuffledArrays[1]shuffledArrays[2]指向相同的数组。

© www.soinside.com 2019 - 2024. All rights reserved.