Java:有没有办法计算2d数组中int的出现次数?

时间:2013-11-06 13:53:10

标签: java arrays

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

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 个答案:

答案 0 :(得分:6)

您的方法

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

失败,因为您在0列表中搜索int[]。当然,频率始终为零。这似乎是一种可能的途径:

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

但遗憾的是它失败了,因为带有基本类型参​​数的Arrays.asList只会导致单个元素List<int[]>。这可以通过将自己的asList引入到自动装箱中来修复,但这不值得,因为那时性能会受到相当大的影响。

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

IMO你以最好的方式做到了,因为你无法避免迭代你阵列中的所有项目

答案 3 :(得分:0)

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

我并不是说这种迭代数组的性能更高,只需更少的代码行。