Java中翻转多维数组

3
我有一个类,可以创建指定宽度和高度的字符画布。在其中,我有一个方法 drawLetter(),它能够将字符更改为字母以显示在画布上(类似简单的ASCII艺术)。
此外,我还有三个方法:rotateClockwise、flipHorizontal和flipVertical。
旋转和水平翻转方法正常工作,但是我无法弄清楚垂直翻转数组出了什么问题(感兴趣的话,我认为我把水平和垂直搞混了,但我会在下面放一个样例)。
这就是我解决不了的问题:
这个:
# # # ~
~ # ~ ~
~ # ~ ~
~ ~ ~ ~

转换为:

~ # # #
~ ~ # ~
~ ~ # ~
~ ~ ~ ~

显然,这将使用for循环完成,就像我的其他方法一样。下面我会发布我已经完成的水平和顺时针旋转的方法,以证明这不是我无法完成的家庭作业。
void mirrorHorizontally()
{
    char[][]horizontalImage = new char[height][width];

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


void rotateClockwise()
{
    char[][] rotatedImage = new char[height][width];

    for(int i=0; i< canvasArray.length; i++)
    {
        for(int j= canvasArray.length-1; j >= 0; j--)
        {
            rotatedImage[i][rotatedImage.length-1-j] = canvasArray[j][i]; 
        }
    }

    printPicture(rotatedImage);
}

canvasArray是一个char[][]类变量,其中保存了原始感兴趣的图像。


你有什么问题吗?交换操作没有正常工作吗? - John Ericksen
老实说,我就是想不出如何为这个值交换的for循环结构化。 - AngryDuck
我之前用过2D char[] 和字符串数组等方法来实现这个功能,但现在我想通过使用多维数组来改进这个简单的应用程序。 - AngryDuck
基本上,它与 mirrorHorizontally() 相同,只是高度/宽度的访问模式相反。 但是,你可能想要研究一下使用标准库:Apache 的 ArrayUtils 具有 reverse(...) 方法,可用于各个级别的数组。 - Clockwork-Muse
谢谢,但我不使用库,这不是我想要的功能,更多的是这似乎是一个很好的例子来学习多维数组的工作原理。 - AngryDuck
1个回答

3
这应该符合您的需求:
public static char[][] mirror(int width, int height, char[][] in) {
    char[][] out = new char[height][width];
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            out[i][width - j - 1] = in[i][j];
        }
    }
    return out;
}

例如:

char[][] in = new char[][] {
    new char[] { '#', '#', '#', '~' },
    new char[] { '~', '#', '~', '~' },
    new char[] { '~', '#', '~', '~' },
    new char[] { '~', '~', '~', '~' },
    new char[] { '~', '~', '~', '~' }
};

for (char[] line : mirror(4, 5, in)) {
    for (char row : line) {
        System.out.print(row);
    }
    System.out.println();
}

输出:

~###
~~#~
~~#~
~~~~
~~~~

1
+1,看完这个我不打算发布我的复杂方法 ;) - jlordo
非常感谢,这正是我一直在寻找的。与我之前使用的方法完全相同的风格,只是有时候看得太久了,没有看到显而易见的东西,再次感谢。 - AngryDuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接