【问题标题】:method is changing my class variable char[][] but i dont know why java方法正在更改我的类变量 char[][] 但我不知道为什么 java
【发布时间】:2013-02-21 14:28:53
【问题描述】:

我真的不知道该怎么称呼这个问题,所以请随意编辑它......

基本上我有一个 char[][] 类变量“canvasArray[][]”

它以不同的方法填充了代表画布上一个字母的字符(类似于 ASCII 艺术)

我有一个方法可以水平翻转这个图像

void mirrorHorizontally()
{
    char[][]horizontalImage = canvasArray;


    for (int i = 0; i < height /2; i++)
    { 
       for(int j = 0; j < width; j++)
       {            
           horizontalImage[height - (i+1)][j] = horizontalImage[i][j];           
           horizontalImage[i][j] = horizontalImage[height - (i+1)][j];
       }
    }

    printPicture(horizontalImage);
}

据我所见,我只是将 char[][] 水平图像设置为 canvasArray 的值,但似乎不是因为如果我打印 canvasArray 而不是它向我显示相同的值。

我需要画布数组保持不变,因为我还有其他方法也需要使用它

有什么想法吗??

提前致谢

编辑:感谢所有回答的人,恐怕答案是你们所说的一切的结合,所以我不知道该接受谁??

【问题讨论】:

    标签: java arrays char


    【解决方案1】:

    我会选择类似的东西:

    void mirrorHorizontally()
    {
        char[][]horizontalImage = new char[horizontalImage.length][horizontalImage[0].length]; // assumes all lines have same length
    
    
        for (int i = 0; i < height /2; i++)
        { 
           for(int j = 0; j < width; j++)
           {            
               horizontalImage[height - (i+1)][j] = canvasArray[i][j];           
               horizontalImage[i][j] = canvasArray[height - (i+1)][j];
           }
        }
    
        printPicture(horizontalImage);
    }
    

    这样我创建了一个新缓冲区(不是引用和修改旧缓冲区)并直接使用它来填充新缓冲区

    【讨论】:

    • 感谢您的回答,这也可以正常工作,这很烦人,因为 iv 以前也这样做过,但只是其中一次您卡在某事上而忘记了简单的答案
    • 去过那里,做到了... :) 有时去散步帮助解决不可能的问题;)
    【解决方案2】:

    您的第一次调用会清除 [height - (i+1)][j] 的旧值。相反,存储旧值以便您可以在下面使用它:

    char temp = horizontalImage[height - (i+1)][j];
    horizontalImage[height - (i+1)][j] = horizontalImage[i][j];
    horizontalImage[i][j] = temp;
    

    【讨论】:

    • 感谢这确实有效,还解决了我遇到的另一个问题,即原始和水平翻转图像都显示在打印水平阵列上。无论如何,这并没有阻止它覆盖原始数组,但我认为 rdcrng 的答案解决了这个问题
    【解决方案3】:

    在 Java 中,数组是对象。因此,当您分配char[][]horizontalImage = canvasArray; 时,horizontalImagecanvasArray 都指向同一个数组对象。这意味着当您修改horizontalImage 时,您也修改了canvasArray。您需要将 canvasArray 中的值复制到新的 horizontalImage 中。

    编辑: 试试这个:

    for (int i = 0; i < height /2; i++)
       { 
       for(int j = 0; j < width; j++)
       {            
           horizontalImage[height - (i+1)][j] = canvasImage[i][j];           
           horizontalImage[i][j] = canvasImage[height - (i+1)][j];
       }
    }
    

    并省略循环前的赋值。

    【讨论】:

    • 所以只需使用 for 循环开始方法,将所有值从一个设置到另一个?
    • 如果只有你和@MrSpoon 可以合并你的答案......因为两者实际上都是完整解决方案所必需的。
    • @user1110338 我会改为在您的 for 循环逻辑中执行此操作 - 请参阅编辑。
    • @user1110338 Grimmy 的回答很好。和我想要的一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多