java - 如何在Java中翻转二维数组

标签 java

嗨,我正在开发一个简单的 L 游戏。我想水平从左到右翻转数组。例如,

{ 'x',' ',' ',' ' },

{ 'x',' ',' ',' ' },

{ 'x','x',' ',' ' },

{ ' ',' ',' ',' ' }

我想把它翻转到

{ ' ','x',' ',' ' },

{ ' ','x',' ',' ' },

{ 'x','x',' ',' ' },

{ ' ',' ',' ',' ' }

这是我当前的代码

    public void flipArray() {
    int rows = cells.length;
    int cols = cells[0].length;
    char temp[][] = new char[rows][cols];
    for (int i = rows-1; i>=0; i--) {
        for (int j = cols-1; j>=0; j--) {
            temp[rows-1-i][cols-1-j] = cells[i][j];
        }
    }
    for (int i=0; i<rows; i++) {
        for (int j=0; j<cols; j++) {
            System.out.print(temp[i][j] + " ");
        }
    }
    }

非常感谢您的帮助,非常感谢。 这就是我想要的结果。



    rand_seed = 14427                                                       rand_seed = 14427
$ LGame.main({})                                                        $ LGame.main({})
A i i                                                                   A i i   
  o i                                                                     o i   
  o i                                                                     o i   
  o o B                                                                   o o B 
Move: o101                                                              Move: o101
A i i                                                                   A i i   
  o i                                                                |  o   i   
  o i                                                                |  o   i   
o o   B                                                                 o o   B 

最佳答案

你的代码是如此复杂,我什至没有试图理解它。如果将问题分解为子问题,问题就会变得更简单、更容易掌握。

首先是基本构建 block ,反转单个数组:

 static void flip(char[] array) {
     int left = 0;
     int right = array.length - 1;
     while (left < right) {
         char temp = array[left];
         array[left] = array[right];
         array[right] = temp;
         ++left;
         --right;
     }
 }

现在您只需遍历行数组并为每一行调用翻转:

static void flip(char[][] rows) {
    for (char[] row : rows) {
        flip(row);
    } 
}

当你把它分解成更小的问题时,你会发现它非常简单。

编辑: 在二维数组中找到“L”的边界框可以再次分解为更小的问题。您可以遍历行,检查它们是否完全为空,如果不是,则找到“设置”单元格的最小和最大索引。为简单起见,我在两个嵌套循环中用一种方法执行此操作:

 static int[] getBoundingBox(char[][] rows) {
     int minY = Integer.MAX_VALUE;
     int maxY = Integer.MIN_VALUE;
     int minX = Integer.MAX_VALUE;
     int maxX = Integer.MIN_VALUE;
     for (int y=0; y<rows.length; ++y) {
         // find the rows min/max populated index
         char[] row = rows[y];
         int rowMinX = Integer.MAX_VALUE;
         int rowMaxX = Integer.MIN_VALUE;
         for (int x=0; x<row.length; ++x) {
             if (row[x] == 'x') {
                 rowMinX = Math.min(rowMinX, x);
                 rowMaxX = Math.max(rowMaxX, x);
             }                 
         }
         // check if the row is empty (min > max)
         if (rowMinX > rowMaxX) {
              // empty row, skip
              continue;
         }
         // update bounding box variables
         minY = Math.min(minY, y);
         maxY = Math.max(maxY, y);
         minX = Math.min(minX, rowMinX);
         maxX = Math.max(maxX, rowMaxX);
     }          
     // result is an array containing the bounds
     return new int[] { minX, minY, maxX, maxY };
}

您现在应该真的能够将各个部分连接起来。

Edit2:剩下要做的就是修改 Flip(rows[][]) 以获取边界,并为 minY 和 maxY 之间的行调用 Flip(row[]) 。然后,行翻转需要从边界传递最小/最大 X,并使用传递的值而不是左/右的 0/长度。想一想,稍微想一想就很明显了。

题外话,但您可能仍在学习这一点:将代码拆分为每个仅解决一个子问题的小方法的原因是您可以a)重复使用它们来解决相同的问题b) 方法中的代码越少,就越容易验证它的作用以及它是否有效。将所有内容打包在一个大方法中会使其更难以理解,并且当您需要在其他地方解决部分问题时,您将重复代码(和工作)。

关于java - 如何在Java中翻转二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619165/

相关文章:

java - 变音符号 (äöü) 的奇怪编码

java - Pebbles StringLoader可以重复使用来加载不同的模板吗?

java - 如何使用 Spring Data REST 存储库创建和连接相关资源?

java - 指纹SDK体验

java - 数组索引越界 - 类名称约定

java - 作为 war 运行时从 UI 升级 Jenkins

java - 尝试使用 Mockito 进行监视时出现异常

java - 从以编程方式打开 android 键盘获取文本

java - 从文本文件读取,记录用空行分隔(java)

java - 使用 [] 调用时出现奇怪的 java.lang.ClassCastException