2014-02-09 67 views
2

最近我们学习了二维数组并解决了计算其中所有元素的平均值的任务。我的代码是这样的:二维数组中的元素总数

int a[][] = { 
    {1, 2, 3, 4, 5}, 
    {6, 4, 2, 7}, 
    {3, 6}, 
    {2, 6, 8}, 
}; 

int sum=0, amount=0; 
for (int[] row : a) 
    for (int val : row) { 
    sum += val; amount += 1; 
    } 

return sum/(double) amount; 

事情是,我不喜欢我计算数组中的元素数量的方式。我尝试使用大小(),它没有工作,试图使用数组和数组类,但都可以检索行的数量和行数量,就像.length属性。

问题:是有从两个或更多维矩阵检索元素的量,而无需使用环的任何方式

+0

由于第一个数组中的每个数组可能有不同的大小,我认为你需要一个循环。 – ThePerson

+0

我认为尾声非常简洁。 –

+0

想到也许我在学习的时候错过了一些东西。 – aka

回答

2

不,没有Java的本地功能,因为阵列(阵列(数组...))本身不是语言结构。数组是数组,但是数组的数组只是一个对象数组(它可能也是,但不一定是数组)。符号Object[][]只是为多维数组提供了类型安全性。

如果没有循环,你无法计算这个值,但是你可以使用任意维数组的反射和递归来解决它。


一个通用的解决方案,在性能是不是一个问题,用递归和java.lang.reflect.Array可能是这个样子才是最重​​要的任意维数组的所有非数组元素:

public static int size(Object object) { 
    if (!object.getClass().isArray()) { 
     return 1; 
    } 

    int size = 0; 
    for (int i = 0; i < Array.getLength(object); i++) { 
     size += size(Array.get(object, i)); 
    } 
    return size; 
} 

您可以致电此与任何目标函数:

int[][] matrix = { 
    { 1, 2, 3 }, 
    { 4, 5, 6 }, 
    { 7, 8, 9 } 
}; 


Object[] array = { 
    "1", 
    new String[]{ 
     "2", "3", "4" 
    }, 
    new int[][] { 
     { 5 }, 
     { 6, 7 }, 
     { 8, 9, 10 } 
    } 
}; 


String literal = "literal"; 

System.out.println(size(matrix)); 
System.out.println(size(array)); 
System.out.println(size(literal)); 

然后将输出

9 
10 
1 

这不是一个很优雅的解决方案,但由于polygenelubricants所言:

这将是非常重复(但即使java.util.Arrays很重复),但是这是在Java中使用数组的方式。

+0

是的,这是一个很好的方法,递归地查看维度,我会记住这一点,谢谢。另外,我搜索了这两天的其他方法,但没有找到任何方法,但明白为什么在java的情况下实现这种方法是不值得的。 – aka

1

没有。 Java中并没有真正的2d数组的概念(C#有它),但实际上有一个数组数组。由于每个“内部”数组可以有不同的长度,所以很难做到没有循环。

循环是一个真正的问题,还是只是寻找更“内置”的解决方案?

+0

是的,我期待任何内置的解决方案。但没有发现任何... – aka