Массив Java, изменяющий нетронутые значения

Я работаю над генетическим алгоритмом, который воссоздает картины с использованием треугольников. В настоящий момент мой метод, используемый для заселения детей, меняет ценности родителей, и я не могу понять, почему.

public void populate()
{
    System.out.println("pre: " + Arrays.toString(triangles[0][0]));
    for(int drawNum = 2; drawNum < 12; drawNum ++)
    {
        for(int triNum = 0; triNum < numTriangles; triNum ++)
        {
            double pChooser = Math.random();
            if (pChooser < .45)
            {
                triangles[drawNum][triNum] = triangles[0][triNum];
            }
            else if (pChooser < .9)
            {
                triangles[drawNum][triNum] = triangles[1][triNum];
            }
            else
            {
                triangles[drawNum][triNum] = randomTriangle();
            }
        }
    }
    genNum ++;
    System.out.println("pst: " + Arrays.toString(triangles[0][0]));
}

private int[] randomTriangle()
{
    int[] result = new int[9];
    for(int i = 0; i < 9; i++)
    {
        result[i] = (int) (Math.random() * 256);
    }
    return result;
}

triangles - это трехмерный массив int, который содержит каждый рисунок, каждый треугольник на рисунке и каждое значение конечных точек и цвет треугольника в форме triangles[drawingNumber][triangleNumber][values]. triangles[0] и triangles[1] - это два родителя. Операторы print печатают значения первого треугольника в первом родительском элементе до и после формирования дочерних элементов. Однако операторы до и после печати возвращают разные результаты, что означает, что triangles[0][0] был изменен где-то в коде, но я не могу понять, где это.

Какого типа элементы в массиве triangles?

Joffrey 07.05.2018 23:28

треугольники - это int [] [] []. Он содержит текущие ценности родителей и детей. @Carcigenicate

Josh Czopek 07.05.2018 23:30

Учитывая индексы ваших циклов, для triangles[0][0] не представляется возможным назначить другой массив int[] в этих циклах, поэтому это должен быть тот же массив. Возможно ли, что ваш метод randomTriangle() записывает в существующий массив triangles[i][j]?

Joffrey 07.05.2018 23:35

Можете выложить код randomTriangle()? Он вообще пишет на triangles?

Joffrey 07.05.2018 23:37

@Joffrey randomTriangle() просто создает и возвращает int[], который содержит значения для нового треугольника.

Josh Czopek 07.05.2018 23:37

Как генерируется triangles?

Ishamael 08.05.2018 00:14

@Ishamael первые родители генерируются случайным образом, а остальные заполняются с помощью populate()

Josh Czopek 08.05.2018 00:18

Думаю, мой вопрос заключался в том, как создается массив, а не как вычисляются значения.

Ishamael 08.05.2018 00:26

@Ishamael это общедоступная глобальная переменная, созданная как public int[][][] triangles = new int[12][numTriangles][9]

Josh Czopek 08.05.2018 00:30

Еще два вопроса: все ли однопоточно, и вы когда-нибудь меняли элементы нижнего уровня triangles (например, треугольники [a] [b] [c])

Ishamael 08.05.2018 02:34

@JoshCzopek, похоже, нам просто не хватает информации, чтобы помочь вам. Попробуйте предоставить MCVE, чтобы мы могли видеть, что происходит. Здесь, если все однопоточное, если мы удалим genNum ++; и добавим инициализацию triangles, похоже, что у нас есть минимальный рабочий код. Это воспроизводит вашу проблему (поскольку два оператора печати печатают разные вещи)?

Joffrey 08.05.2018 10:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
63
0

Другие вопросы по теме