【问题标题】:Zero a row in a 2D array if the number zero exists in it如果其中存在数字零,则将二维数组中的一行归零
【发布时间】:2020-04-08 12:32:23
【问题描述】:

我需要写一些东西来获得一个 MxN 2D 数组,遍历每一行并搜索数字 0。如果该行中存在数字零,则整行将设置为 0。

例如,这个:

int[][] arr ={{ 144, 2, 3, 2, 5, 0},
              {2, 36, 1, 2, 1, 6},
              {0, 0, 9, 0, 3, 5},
              {4, 4, 4, 225, 3, 4},
              {1, 1, 1, 1, 16, 1}};

会变成这样:

int[][] arr ={{ 0, 0, 0, 0, 0, 0},
              {2, 36, 1, 2, 1, 6},
              {0, 0, 0, 0, 0, 0},
              {4, 4, 4, 225, 3, 4},
              {1, 1, 1, 1, 16, 1}};

我没有取得太大进展。我将行设置为零的所有尝试要么不起作用,要么将数组中的所有内容都归零。

import java.util.Arrays;

public class TwoDarr { 
    public static void ZeroNum(int[][] arr) {

        for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    if (arr[i][j] == 0) {
                        ???
                    }
                }
                }
            }
        public static void main(final String[] args) {
            int[][] arr ={{ 144, 2, 3, 2, 5, 0},
                            {2, 36, 1, 2, 1, 6},
                            {0, 0, 9, 0, 3, 5},
                            {4, 4, 4, 225, 3, 4},
                            {1, 1, 1, 1, 16, 1}};
        ZeroNum(arr);

        for (int i = 0; i < arr.length; i++) {
            System.out.println(Arrays.toString(arr[i]));
        }
        }
    }

对此事的任何帮助都会很棒, 谢谢:)

【问题讨论】:

  • 您到底尝试了什么?简单的arr[i] = new int[arr[i].length]]; 应该可以工作
  • @UnholySheep 确实有效!我想这归结为我没有足够的基础知识。如何分解您发送到此处的代码行?
  • 它只是将数组替换为一个新数组(长度相同),int 的默认值为 0。或者您可以考虑使用Arrays.filldocs.oracle.com/javase/7/docs/api/java/util/…
  • @UnholySheep 如果您能回答帖子,我很乐意将其标记为已解决,我实际上只是在 if 之后的嵌套循环中添加了您的代码行。非常感激!谢谢:)

标签: java arrays


【解决方案1】:

使用Arrays.fill0s 填充行。请注意,Java 中的二维数组是一维数组的数组。

演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] arr ={{ 144, 2, 3, 2, 5, 0},
                  {2, 36, 1, 2, 1, 6},
                  {0, 0, 9, 0, 3, 5},
                  {4, 4, 4, 225, 3, 4},
                  {1, 1, 1, 1, 16, 1 } };
        for (int[] row : arr) {
            for (int col : row) {
                if (col == 0) {
                    Arrays.fill(row, 0);
                    break;
                }
            }
        }
        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}

输出:

[0, 0, 0, 0, 0, 0]
[2, 36, 1, 2, 1, 6]
[0, 0, 0, 0, 0, 0]
[4, 4, 4, 225, 3, 4]
[1, 1, 1, 1, 16, 1]

如下所示,您可以在不使用增强的 for 循环的情况下实现它,但我建议您使用上面给出的更清洁的解决方案:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] arr ={{ 144, 2, 3, 2, 5, 0},
                  {2, 36, 1, 2, 1, 6},
                  {0, 0, 9, 0, 3, 5},
                  {4, 4, 4, 225, 3, 4},
                  {1, 1, 1, 1, 16, 1 } };
        for(int i=0; i<arr.length; i++) {
            for (int j=0; j<arr[i].length; j++) {
                if(arr[i][j] == 0) {
                    arr[i] = new int[arr[i].length];
                    break;
                }
            }
        }
        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}

此替代解决方案仅在元素必须更改为 0(这是 int 的默认值)时才有效。

【讨论】:

  • 感谢您的回答!使用Arrays.fill 方法和arr[i] = new int[arr[i].length]; 方法有什么区别吗?
  • 不客气。我已经更新了我的答案以澄清它。如果您需要任何进一步的帮助,请随时发表评论。
  • @Socowi - 很棒的建议!我已经更新了答案以将其合并。
【解决方案2】:
public static void main(String[] args) {
    int[][] arr2d ={{...}};
    for (int i = 0; i < arr2d.length; i++) {
        if (containsZero(arr2d[i])) {
            arr2d[i] = new int[arr2d[i].length]]
        }
    }
}

public static boolean containsZero(int []arr) {
    for (int n : arr) {
        if (n == 0) {
            return true;
        }
    }
    return false;
}

【讨论】:

  • 谢谢!我想知道您的方法是否能提供更好的性能、运行时间/步数?
  • 性能与其他答案相同。唯一的区别是我在这里将代码拆分为两种方法,因此 containsZero 是可重用的。如果你想提高性能,你不应该使用数组
【解决方案3】:
public static void main(String[] args) {
        int[][] arr ={{ 144, 2, 3, 2, 5, 0},
                {2, 36, 1, 2, 1, 6},
                {0, 0, 9, 0, 3, 5},
                {4, 4, 4, 225, 3, 4},
                {1, 1, 1, 1, 16, 1 } };

      for(int i=0; i<arr.length; i++) {
          for (int j=0; j<arr[i].length; j++) {
              if(arr[i][j] == 0) {
                 arr[i]=new int[arr[i].length];
                  break;
              }
          }
      }
      for (int[] row : arr) {
          System.out.println(Arrays.toString(row));
      }


    }

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2012-06-26
    相关资源
    最近更新 更多