【问题标题】:Total amount of elements in two dimensional array二维数组中的元素总数
【发布时间】:2014-02-09 01:04:20
【问题描述】:

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

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;

问题是我不喜欢计算数组中元素数量的方式。 我尝试使用 size(),但它不起作用,尝试使用 Array 和 Arrays 类,但两者都无法检索某行中的行数或元素数,就像 .length 属性。

问题:是否有任何方法可以在不使用循环的情况下从二维或更多维矩阵中检索元素数量?

【问题讨论】:

  • 由于第一个数组中的每个数组可能有不同的大小,我认为你需要一个循环。
  • 我觉得结尾很简洁。
  • 我想也许我在学习时错过了一些东西。

标签: java java-7


【解决方案1】:

不,没有本机 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 中使用数组的方式。

【讨论】:

  • 是的,这很好,递归地查看维度,我会记住的,谢谢。另外这两天找了其他的方法也没找到,但是明白为什么在java的情况下不值得实现这样的方法。
【解决方案2】:

不。在 Java 中并没有真正的二维数组的概念(尽管 C# 有) - 你所拥有的实际上是一个数组数组。而且由于每个“内部”数组都可以有不同的长度,所以没有循环就很难做到。

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

【讨论】:

    【解决方案3】:

    找出数组中有多少元素。

    public class MultiArrayEx3 {
        public static void main(String[]args) {
    
            int[][] myNumbers = { {1,2,3,4,5}, {6,7,8,9} };
            int x = myNumbers[0].length;
            int y = myNumbers[1].length;
            int z = x + y;
    
            System.out.println(z);
    
        }
    }
    

    【讨论】:

    • ...如果输入数组只有 1 个数组怎么办?还是 20 个?
    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多