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

xqkwcwgp  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(377)

我注解了我的代码,以帮助您理解我的逻辑,我基本上收到一个边值,我必须画一个三角形使用x的视觉显示其周长(各方都是平等的)
因此,在创建将填充包含图形的矩阵的单个数组时,随着迭代的继续,一些赋值会丢失,只保留最后一次迭代的值,并用这些值填充整个矩阵,这使我失去了所有的前一行,组成一个漂亮的三角形绘图,我无法打印成一个txt文件(我可以通过在循环中打印来在控制台中打印它,因为它生成了对应于一条绘图线的每个数组,但这只是一个暂时的幻觉,因为我没有将矩阵和x保持在适当的位置)。
如果有人能帮我不失去这个价值,并且能把它储存起来,我会很高兴的。
注意:父类figura只提供一个名为lado的int。

  1. public class Triangulo extends Figura {
  2. char[] lineaI;
  3. char[] lineaT;
  4. char[][] matT;
  5. public char[][] matDibujo(int lado) {
  6. this.linea = new char[(lado+lado-1)]; //side int value to determine an eq. triangle base length
  7. lineaI = new char[linea.length]; //multiple intermediate single arrays that fill triangle diagonally
  8. lineaT = new char[linea.length]; //triangle base array
  9. matT = new char[lado][linea.length]; // matrix containing {{},{},{},{}} n individual arrays representing a row in the drawing (top to bottom)
  10. //Create triangle base line array
  11. for (int i = 0; i < linea.length; i++) {
  12. if (i == 0 ) {
  13. linea[i] = 'X';
  14. } else if (i%2 == 0) {
  15. linea[i] = 'X';
  16. } else {
  17. linea[i] = ' ';
  18. }
  19. //Create triangle top point array
  20. if (i == (lado-1)) {
  21. lineaT[i] = 'X';
  22. } else {
  23. lineaT[i] = ' ';
  24. }
  25. }
  26. //Fill matrix with first array (top axis)
  27. matT[0] = lineaT;
  28. //Fill matrix last array (triangle base)
  29. matT[lado-1] = linea;
  30. //System.out.println(matT[lado-1]);
  31. //THIS IS THE LOOP NOT SAVING CORRESPONDING lineaI full single array to matT[j],
  32. //instead it's replacing every matT[j] with the last value of lineaI.
  33. //Create multiple arrays to fill n-sided triangle from top axis to base diagonally (parting from top axis)
  34. for (int j = 1; j < (lado-1); j++) {
  35. for (int i = 0; i < linea.length; i++) {
  36. if (i == (lado-1-j) ) {
  37. lineaI[i] = 'X';
  38. } else if (i == (lado-1+j) ) {
  39. lineaI[i] = 'X';
  40. } else {
  41. lineaI[i] = ' ';
  42. }
  43. }
  44. matT[j] = lineaI;
  45. }
  46. //return the matrix so we can print it
  47. return matT;
  48. }
  49. //Dibujar en txt
  50. public void dibuja(char[][] matriz) {
  51. for (int i = 0; i < matriz.length; i++) {
  52. System.out.println(matriz[i]);
  53. }
  54. }
  55. public static void main(String[] args) {
  56. char[][] mat;
  57. Triangulo t = new Triangulo();
  58. mat = t.matDibujo(4);
  59. t.dibuja(mat);
  60. //This is the outcome, since we lost matT[1] and got it replaced by the last lineaI contents, which should
  61. //only belong to matT[2]
  62. /* X The outcome should be X
  63. X X X X ---> this line is lost and
  64. X X X X ----> replaced by this one
  65. X X X X X X X X */
  66. }
  67. }
u4dcyp6a

u4dcyp6a1#

这里的问题是lineai数组值一旦计算出来,就将它赋给matt[j],然后再次用新值覆盖同一lineai引用,并为每个j值附加到matt。
这将导致值被覆盖,并显示所有间歇行的最终数组值。
要解决这个问题,只需在每个j值的迭代开始时,将lineai变量重新初始化为一个新数组。

  1. for (int j = 1; j < (lado-1); j++) {
  2. //initialize the lineaI variable for start of new j value in loop
  3. lineaI = new char[linea.length]; // <----- new change
  4. for (int i = 0; i < linea.length; i++) {
  5. if (i == (lado-1-j) ) {
  6. lineaI[i] = 'X';
  7. } else if (i == (lado-1+j) ) {
  8. lineaI[i] = 'X';
  9. } else {
  10. lineaI[i] = ' ';
  11. }
  12. }
  13. matT[j] = lineaI;
  14. }
展开查看全部

相关问题