Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:有没有办法计算2d数组中int的出现次数?_Java_Arrays - Fatal编程技术网

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

Java:有没有办法计算2d数组中int的出现次数?,java,arrays,Java,Arrays,我想知道是否有比我更快的方法来计算二维数组中有多少个零。我现在是这样做的 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

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

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++;
             }
         }
     }
static int zeroinded=0;
静态int[][]板=新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}}; 
静态void initialZeroCounting(){
for(int-outer=0;outer
我尝试了这个片段的许多变体,但没有结果

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

既然你必须检查所有元素来判断它是否为0,那么就没有其他方法可以遍历所有元素。

既然你必须检查所有元素来判断它是否为0,那么就没有其他方法可以遍历所有元素。

在我看来,你这样做是最好的,因为你无法避免遍历h您阵列中的所有项目

在我看来,您是以最好的方式完成的,因为您无法避免迭代阵列中的所有项目

您的方法

List<int[]> list = Arrays.asList(board);
int count = Collections.frequency(list, 0);
但不幸的是,它失败了,因为
数组。带有基元类型参数的asList
只会产生一个元素
List
。这可以通过引入您自己的
asList
来修复,但这不值得,因为这样性能会受到相当大的影响

您还可以将
int[][]
交换为
整数[][]]
(初始值设定项保持不变)。这将减少性能损失,但现在阵列的内存消耗将增加6倍,这在我的书中是不值得的

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

您的方法

List<int[]> list = Arrays.asList(board);
int count = Collections.frequency(list, 0);
但不幸的是,它失败了,因为
数组。带有基元类型参数的asList
只会产生一个元素
List
。这可以通过引入您自己的
asList
来修复,但这不值得,因为这样性能会受到相当大的影响

您还可以将
int[][]
交换为
整数[][]]
(初始值设定项保持不变)。这将减少性能损失,但现在阵列的内存消耗将增加6倍,这在我的书中是不值得的


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

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


我并不是说这比迭代数组更有效,只需要更少的代码行。

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


我并不是说这比迭代数组性能更好,只是代码行更少。

您的解决方案是O(n^2)。您不可能在计算复杂度级别上做得更好,因为您必须检查n^2个元素。您可以做的最好的事情可能是降低系数,但这样做不会注意到真正的性能变化,除非数组相对较小,即使这样,变化也将是最小的。而不是将
zeroInside
静态和你的函数
void
,使你的函数返回一个
int
,并使用局部变量进行计数。如果你坚持目前的方法,你可能会看到通过分配board.length和board[outer]来提高性能.length到变量。目前,循环的每次迭代都会计算长度,除非编译器对其进行优化。@Antoniossss我使用.frequency方法得到0,原因是Marko Topolnik您的解决方案是O(n^2)。您不可能在计算复杂度级别上做得更好,因为您必须检查n^2个元素。您可以做的最好的事情可能是降低系数,但这样做不会注意到真正的性能变化,除非数组相对较小,即使这样,变化也将是最小的。而不是将
zeroInside
静态和你的函数
void
,使你的函数返回一个
int
,并使用局部变量进行计数。如果你坚持目前的方法,你可能会看到通过分配board.length和board[outer]来提高性能.length到变量。目前,循环的每次迭代都会计算长度,除非编译器对其进行优化。@Antoniosss我使用.frequency方法得到0,因为Marko TopolnikNo所述的原因,它对我不起作用!!我第一次尝试过,但似乎没有计算频率!是的,
asList
使用prim原语类型数组不起作用:它将产生一个成员
列表
。不,它对我不起作用!!我第一次尝试过,但似乎没有计算频率!是的,
asList
与原语类型数组不起作用:它将产生一个成员
列表