1

我想知道是否有比我更快的方法来计算二维数组中有多少个零。这就是我现在的做法。

static int zeroInside = 0;
static int[][] board = new int[][]{
          {5,0,0,0,1,0,0,7,0},
          {1,0,0,0,8,0,3,0,0},
          {0,6,0,2,3,0,0,5,0},
          {2,5,0,7,0,0,6,3,0},
          {9,0,0,3,0,1,0,0,5},
          {0,3,1,0,0,8,0,2,7},
          {0,2,0,0,9,5,0,1,0},
          {0,0,9,0,6,0,0,0,2},
          {0,8,0,0,7,0,0,0,6}}; 
static void initialZeroCounting(){
     for (int outer = 0; outer < board.length;outer++){
         for(int inner = 0; inner < board[outer].length; inner++){
             if (board[outer][inner] ==0){
                 zeroInside++;
             }
         }
     }

我尝试了这个片段的许多变体,但没有结果。

     List<int[]> list = Arrays.asList(board);
     int count = Collections.frequency(list, 0);
4

4 回答 4

7

你的方法

List<int[]> list = Arrays.asList(board);
int count = Collections.frequency(list, 0);

失败,因为您0int[]. 自然,频率将始终为零。这似乎是一个可能的途径:

for (int[] row : board) count += frequency(asList(row), 0);

但不幸的是,它失败了,因为Arrays.asList使用原始类型的参数只会产生一个单元素List<int[]>。这可以通过引入你自己asList的自动装箱来解决,但这不值得,因为那样性能会受到很大影响。

您也可以将您的换成int[][]一个Integer[][](初始化程序保持不变)。这将减少性能损失,但现在数组的内存消耗将增加 6 倍——在我的书中再次不值得。

结论:只需使用嵌套的 for 循环即可。

于 2013-11-06T14:00:43.183 回答
5

由于您必须检查所有元素以判断它是否为 0,因此没有其他方法可以遍历所有元素。

于 2013-11-06T13:54:47.537 回答
1

IMO,您以最好的方式做到了,因为您无法避免遍历数组的所有项目

于 2013-11-06T13:56:29.270 回答
0

您可以使用 Arrays.deepToString() 将数组转换为逗号分隔的字符串,然后使用 commons StringUtils.countMatches 来计算字母“零”的出现次数。

我并不是说这比迭代数组更高效,只是代码行更少。

于 2013-11-06T14:04:58.007 回答