For-l oop перезапись массива после завершения - PullRequest
1 голос
/ 06 мая 2020

В приведенном ниже коде я пытался сделать перетасовку массива. Это перетасует массив символов (charArray) столько раз, сколько диктует runTimes, сохраняя каждый из этих массивов в двумерном массиве shuffledArrays. Проблема в том, что когда программа заканчивает for-l oop, по какой-то причине она устанавливает все массивы на последний добавленный.

Любая помощь приветствуется, спасибо.

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;

    }

}

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Вместо изменения исходного массива вам необходимо изменить копию массива, например,

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 голос
/ 06 мая 2020

Поскольку вы всегда возвращаете массив 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 голосов
/ 06 мая 2020

Вы наблюдали три состояния одного и того же массива . Оператор System.out.println() первой итерации for l oop печатает первое состояние, которое, например, находится в этот самый момент, например f, b, c, e, a, d. Затем во второй итерации вы снова перемешаете тот же массив, например a, e, b, f, c, d. Третья итерация idem dito.

Теперь shuffledArrays[0], shuffledArrays[1] и shuffledArrays[2] указывают на один и тот же массив.

...