Окончательные данные 2D-массива изменяются без неявного изменения их значения с помощью Java - PullRequest
0 голосов
/ 02 февраля 2020

В настоящее время я сталкиваюсь с проблемой, связанной с этим методом getSurroundingSumGrid (), который должен брать данные из более ранней сетки, построенной на основе данных текстового файла, и использовать ее для определения новых значений в массиве sumGrid. Массив STATICGRID создается сначала с правильными значениями, но затем при продолжении for l oop значения STATICGRID меняются на то, что я установил для sumGrid. У меня нет определенного кода, где STATICGRID когда-либо устанавливается равным другому значению, и если я это сделал, это должно выдать ошибку.

public double[][] getSurroundingSumGrid() {

    this.sumGrid = getBaseGrid();

    for (int rowNum = 0; rowNum < sumGrid.length; rowNum++) {
        final double[][] STATICGRID = this.getBaseGrid();
        double topNum = 0, botNum = 0, rightNum = 0, leftNum = 0;

        for (int colNum = 0; colNum < sumGrid[0].length; colNum++) {

            try {
                topNum = STATICGRID[rowNum - 1][colNum];
                System.out.println("TOPNUM : (" + (rowNum-1) + "," + colNum + ") " + STATICGRID[rowNum-1][colNum]);
            } catch (Exception e) {
                topNum = STATICGRID[rowNum][colNum];
                System.out.println("Top IndexOutOfBoundsException: " + STATICGRID[rowNum][colNum] + " used instead.");
            }

            try {
                botNum = STATICGRID[rowNum + 1][colNum];
                System.out.println("BOTNUM : (" + (rowNum+1) + "," + colNum + ") " + STATICGRID[rowNum+1][colNum]);
            } catch (Exception e) {
                botNum = STATICGRID[rowNum][colNum];
                System.out.println("Bot IndexOutOfBoundsException: " + STATICGRID[rowNum][colNum] + " used instead.");
            }

            try {
                leftNum = STATICGRID[rowNum][colNum - 1];
                System.out.println("LEFTNUM : (" + rowNum + "," + (colNum-1) + ") " + STATICGRID[rowNum][colNum-1]);
            } catch (Exception e) {
                leftNum = STATICGRID[rowNum][colNum];
                System.out.println("Left IndexOutOfBoundsException: " + STATICGRID[rowNum][colNum] + " used instead.");
            }

            try {
                rightNum = STATICGRID[rowNum][colNum + 1];
                System.out.println("RIGHTNUM : (" + rowNum + "," + (colNum+1) + ") " + STATICGRID[rowNum][colNum+1]);
            } catch (Exception e) {
                rightNum = STATICGRID[rowNum][colNum];
                System.out.println("Right IndexOutOfBoundsException: " + STATICGRID[rowNum][colNum] + " used instead.");
            }

            this.sumGrid[rowNum][colNum] = topNum + botNum + rightNum + leftNum;
            System.out.println("STATICGRID NEW NUM : " + STATICGRID[rowNum][colNum]);
            System.out.println("SUMGRID NEW NUM : " + sumGrid[rowNum][colNum]);
        }

    }

    return this.sumGrid;
}

При выполнении этих тестов с кодом я очень ясно вижу, что данные в обоих массивах со временем меняются и, в свою очередь, дают неверные результаты. Я пытался около 2 часов просто перемещать вещи и не могу понять, как заставить это работать должным образом.

Как вы можете даже видеть, я даже пытался перестраивать массив STATICGRID каждый раз Формула l oop завершена, и это даже не помешает результату. Он делает то же самое, независимо от того, где вы поместили STATICGRID (снаружи или внутри на самом верхнем уровне для l oop, и не важно, окончательный он или нет), он делает то же самое , Посмотрев на него так долго, я не могу понять, почему мой код не работает, и у меня возникло небольшое ощущение, что это оператор try-catch, но я бы даже не знал, почему. Я не знаю тонны об этом утверждении и о том, что он делает полностью, но причина, по которой он там, заключается в том, что данные могут получить исключение IndexOutOfBoundsException, поэтому вместо того, чтобы получать их, они вместо этого будут считать себя для каждого исключения IndexOutOfBoundsException, полученного в соответствии с инструкциями присваивания.

Спасибо, и я надеюсь, что это имеет смысл.

1 Ответ

0 голосов
/ 03 февраля 2020

Хорошо, благодаря предложению FredK об использовании deepCopy, я провел небольшое исследование и использовал этот метод для получения лучших результатов. Это unptomizedDeepCopy от Филип Айзехур . Я не совсем понимаю это, но я собираюсь просто использовать это сейчас и потратить некоторое время, узнавая больше об этом и как они работают. В настоящее время я студент CS221, и мы еще не изучили deepCopy.

public static Object deepCopy(Object orig) {
    Object obj = null;
    try {
        // Write the object out to a byte array
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(bos);
        out.writeObject(orig);
        out.flush();
        out.close();

        // Make an input stream from the byte array and read
        // a copy of the object back in.
        ObjectInputStream in = new ObjectInputStream(
            new ByteArrayInputStream(bos.toByteArray()));
        obj = in.readObject();
    }
    catch(IOException e) {
        e.printStackTrace();
    }
    catch(ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    }
    return obj;
}

После этого метода я смог остановить изменение значения массива, используя его перед getBaseGrid ( ) метод.

public double[][] getSurroundingSumGrid() {

    this.sumGrid = (double[][]) GridMonitor.deepCopy(this.getBaseGrid());
    double[][] staticGrid = (double[][]) GridMonitor.deepCopy(this.getBaseGrid());
    double topNum, botNum, rightNum, leftNum;

    for (int rowNum = 0; rowNum < sumGrid.length; rowNum++) {

        for (int colNum = 0; colNum < sumGrid[0].length; colNum++) {

            try {
                topNum = staticGrid[rowNum - 1][colNum];
            } catch (Exception e) {
                topNum = staticGrid[rowNum][colNum];
            }

            try {
                botNum = staticGrid[rowNum + 1][colNum];
            } catch (Exception e) {
                botNum = staticGrid[rowNum][colNum];
            }

            try {
                leftNum = staticGrid[rowNum][colNum - 1];
            } catch (Exception e) {
                leftNum = staticGrid[rowNum][colNum];
            }

            try {
                rightNum = staticGrid[rowNum][colNum + 1];
            } catch (Exception e) {
                rightNum = staticGrid[rowNum][colNum];
            }

            this.sumGrid[rowNum][colNum] = topNum + botNum + rightNum + leftNum;
        }

    }
    return this.sumGrid;
}

Спасибо!

...