我想知道是否有比我更快的方法,来计算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);
答案 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”的出现次数。
我并不是说这种迭代数组的性能更高,只需更少的代码行。