微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

char [] []数组在for循环中分配单个Array [i]时未保存值

如何解决char [] []数组在for循环中分配单个Array [i]时未保存值

我注释了我的代码以帮助您理解我的逻辑,我基本上得到了一个边值,并且必须使用X绘制一个三角形以直观地显示其周长。 (双方都是平等的)

因此,当创建单独的数组来填充包含绘图的矩阵时,随着迭代的继续,一些分配会丢失,仅保留最后一次迭代的值,并使用这些值填充整个矩阵,这使我失去了所有前一行构成一个漂亮的三角形图形,但我无法将其打印到txt文件中。 (我可以在控制台中通过在循环内进行打印来打印它,因为它会生成与绘图线相对应的每个数组,但这只是暂时的幻想,因为我没有将X固定在矩阵中。)

如果有人能帮助我,不要失去该matT [j]值并能够以任何方式存储它,那将是很乐意的。

注意:父类figura仅提供一个称为lado的int。

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                                   */

    }

}

解决方法

这里的问题是,一旦计算出lineaI数组值,便将其分配给matT [j],然后再次用新值覆盖相同的lineaI引用,并为每个j值追加到matT。
这将导致这些值被覆盖,并为所有间歇行显示最终的数组值。

要解决此问题,您只需在每个j值的迭代开始时将lineaI变量重新初始化为一个新数组。

    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;
        
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。