【问题标题】:For-loop overwriting array once finishedFor循环覆盖数组一旦完成
【发布时间】:2020-05-06 01:36:10
【问题描述】:

在下面的代码中,我尝试制作一个数组混洗器。这将按照runTimes 的指示多次对字符数组(charArray)进行洗牌,将这些数组中的每一个存储在二维数组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;

    }

}

【问题讨论】:

  • 您的shuffledArray 没有返回新数组。它返回传入的相同数组。并且您始终传入相同的数组。因此,您将相同的char[] 数组添加到shuffledArrays 很多次。
  • 它确实返回了相同的数组,但它在shuffleArray() 内部发生了变化。这就是为什么"IN FOR LOOP: " 行会打印出三个不同的数组,都是原始版本的改组版本。我不明白的是为什么当它离开for循环时,它刚刚打印出来的所有数组现在都变成了相同的值。
  • 因为你一遍又一遍地改组同一个数组。但最后你仍然只有一个数组。

标签: java arrays for-loop shuffle


【解决方案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

【讨论】:

  • 同意这个解决方案,但你也可以指出OP应该将char[][] shuffledArrays = new char[runTimes][charArray.length];改为char[][] shuffledArrays = new char[runTimes][];。就目前而言,从未使用分配的第二维。
【解决方案2】:

由于您总是返回 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);
}

【讨论】:

    【解决方案3】:

    您观察到同一个数组的三种状态。 for 循环第一次迭代的System.out.println() 语句打印第一个状态,即在那个时刻,例如f, b, c, e, a, d。然后第二次迭代你再次洗牌相同的数组,例如a, e, b, f, c, d。第三次迭代同上。

    现在shuffledArrays[0]shuffledArrays[1]shuffledArrays[2] 指向同一个数组。

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 2016-07-17
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多