массив char[][] не сохраняет значения при назначении одного массива [i] в цикле for

#java #arrays #loops #multidimensional-array #overwrite

#java #массивы #циклы #многомерный массив #перезаписать

Вопрос:

Я прокомментировал свой код, чтобы помочь вам понять мою логику, я в основном получаю значение side, и мне нужно нарисовать треугольник, используя X, чтобы визуально показать его периметр. (все стороны равны)

Итак, при создании отдельных массивов, которые будут заполнять мою матрицу, содержащую чертеж, некоторые из назначений теряются по мере продолжения итерации, сохраняя только значение последней итерации и заполняя всю матрицу этими значениями, из-за этого я теряю все предыдущие строки, которые составляют красивый рисунок треугольника, и я не могу распечатать его в текстовом файле. (Я могу распечатать его в консоли, напечатав внутри цикла, поскольку он генерирует каждый массив, соответствующий линии рисования, но это всего лишь временная иллюзия, поскольку я не сохраняю матрицу с X на месте).

Был бы рад, если бы кто-нибудь мог помочь мне не потерять это значение matT [j] и иметь возможность сохранить его в любом случае.

Примечание: родительский класс Figura предоставляет только значение int с именем lado.

 public class Triangulo extends Figura {

    char[] lineaI;
    char[] lineaT;
    char[][] matT;

    public char[][] matDibujo(int lado) {

        this.linea = new char[(lado lado-1)]; //side int value to determine an eq. triangle base length
        lineaI = new char[linea.length]; //multiple intermediate single arrays that fill triangle diagonally
        lineaT = new char[linea.length]; //triangle base array
        matT = new char[lado][linea.length]; // matrix containing {{},{},{},{}} n individual arrays representing a row in the drawing (top to bottom)

        //Create triangle base line array 
        for (int i = 0; i < linea.length; i  ) {
            if (i == 0 ) {
                linea[i] = 'X';
            } else if (i%2 == 0) {
                linea[i] = 'X';
            } else {
                linea[i] = ' ';
            }
            //Create triangle top point array
            if (i == (lado-1)) {
                lineaT[i] = 'X'; 
            } else {
                lineaT[i] = ' ';
            }
        }

        //Fill matrix with first array (top axis)
        matT[0] = lineaT;
        //Fill matrix last array (triangle base) 
        matT[lado-1] = linea;
        //System.out.println(matT[lado-1]);

        //THIS IS THE LOOP NOT SAVING CORRESPONDING lineaI full single array to matT[j], 
        //instead it's replacing every matT[j] with the last value of lineaI.

        //Create multiple arrays to fill n-sided triangle from top axis to base diagonally (parting from top axis)  
        for (int j = 1; j < (lado-1); j  ) {
            for (int i = 0; i < linea.length; i  ) {
                if (i == (lado-1-j) ) {
                    lineaI[i] = 'X';
                } else if (i == (lado-1 j) ) {
                    lineaI[i] = 'X';
                } else {
                    lineaI[i] = ' ';
                }
            }
            matT[j] = lineaI;
        }

        //return the matrix so we can print it
        return matT;

    }

    //Dibujar en txt
    public void dibuja(char[][] matriz) {

        for (int i = 0; i < matriz.length; i  ) {
            System.out.println(matriz[i]);      
        }

    }
    

    public static void main(String[] args) {

        char[][] mat;
        Triangulo t = new Triangulo();
        mat = t.matDibujo(4);
        t.dibuja(mat);

        //This is the outcome, since we lost matT[1] and got it replaced by the last lineaI contents, which should
        //only belong to matT[2]
        /*      X                     The outcome should be             X                       
              X   X                                                    X X     ---> this line is lost and
              X   X                                                   X   X    ----> replaced by this one
             X X X X                                                 X X X X                                   */

    }

}
  

Ответ №1:

Проблема здесь в том, что после вычисления значения массива lineaI вы присваиваете его matT[j], а затем снова перезаписываете ту же ссылку lineaI новым значением и добавляете к matT для каждого значения j.
Это приводит к перезаписи значений и отображению конечного значения массива для всех прерывистых строк.

Чтобы исправить это, вам просто нужно повторно инициализировать переменную lineaI в новый массив при запуске итерации каждого j значения.

     for (int j = 1; j < (lado-1); j  ) {
        //initialize the lineaI variable for start of new j value in loop
        lineaI = new char[linea.length]; // <----- new change
        for (int i = 0; i < linea.length; i  ) {
            if (i == (lado-1-j) ) {
                lineaI[i] = 'X';
            } else if (i == (lado-1 j) ) {
                lineaI[i] = 'X';
            } else {
                lineaI[i] = ' ';
            }
            
        }
        matT[j] = lineaI;
        
    }