java - 在 Java 中修剪二维数组的有效方法

标签 java arrays algorithm multidimensional-array

我有以下二维数组:

int[][] array = new int[][]{
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
        {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
        {0, 0, 1, 1, 0, 1, 1, 0, 0, 0},
        {0, 0, 1, 1, 0, 1, 0, 0, 0, 0},
        {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
        {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
        {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
};

我想修剪所有周围的零,所以我的输出将是这样的(删除外面的“零”并保留被“一”包围的零):

        {0, 1, 1, 1, 0},
        {0, 1, 1, 1, 1},
        {1, 1, 0, 1, 1},
        {1, 1, 0, 1, 0},
        {0, 1, 1, 1, 1},
        {0, 1, 1, 1, 1},
        {0, 0, 0, 1, 0}

我正在寻找一种有效的方法。

最佳答案

可能的解决方案(不知道这是否是最有效的方法):

public static int[][] trim(int[][] mtx, int rmin, int rmax, int cmin, int cmax) {
   int[][] result = new int[rmax-rmin+1][];
   for (int r = rmin, i = 0; r <= rmax; r++, i++) {
      result[i] = Arrays.copyOfRange(mtx[r], cmin, cmax+1);
   }
   return result;
}

public static int[][] trim(int[][] mtx, int trimmed) {
   int cmin = mtx[0].length;
   int rmin = mtx.length;
   int cmax = -1;
   int rmax = -1;

   for (int r = 0; r < mtx.length; r++)
      for (int c = 0; c < mtx[0].length; c++)
         if (mtx[r][c] != trimmed) {
            if (cmin > c) cmin = c;
            if (cmax < c) cmax = c;
            if (rmin > r) rmin = r;
            if (rmax < r) rmax = r;
         }

   return trim(mtx, rmin, rmax, cmin, cmax);
}

public static void main (String[] args) {
   int[][] array = new int[][]{
      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
      {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
      {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
      {0, 0, 1, 1, 0, 1, 1, 0, 0, 0},
      {0, 0, 1, 1, 0, 1, 0, 0, 0, 0},
      {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
      {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
      {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
   };
   int[][] trim = trim(array, 0);
   System.out.println(Arrays.deepToString(trim));
}

关于java - 在 Java 中修剪二维数组的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50928200/

相关文章:

java - 无法通过 SSL 连接使用 JOOQ 和 MySQL 数据库生成代码

java - 我应该使用多个 glDrawArrays() 还是将所有顶点收集到一个大的 glDrawArrays 调用中?

尝试图像高度时出现 java.lang.ArrayIndexOutOfBoundsException 错误

php - 从 JSONArray 转换为 JSONObject 处理 Android 时出错

c++ - 使用openmp使用eigen c++的Jacobi算法的并行化

c++ - 计算 PI 的值但值未添加到变量

java - 模拟或构建 Jersey InboundJaxrsResponse

javascript - 无法使用 jQuery $.getJSON 读取 JSON 数组中的 JSON 数组

javascript - 从JavaScript中的复杂数据结构中删除特定数据

python - 具有 O(1) 额外空间的 Python 回文链表