如何为数组的'n'个维循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为数组的'n'个维循环?相关的知识,希望对你有一定的参考价值。

我正在尝试创建一种方法,该方法将对项目的数量进行总计(为null或其他),然后返回该总和。以下是一些预期的示例输入:

arraySum(new int[10]); // 10
arraySum(new int[2][5]); // 10
arraySum(new int[5][5][5]); // 125

问题是,我实际上永远无法知道我正在处理多少个维度。到目前为止,我发现在数组上调用String.valueOf(array)会返回一个包含[字符的字符串,但是数组中存在许多维:

String.valueOf(new int[10]); // [I@hash_code
String.valueOf(new int[5][2]); // [[I@hash_code
String.valueOf(new int[5][5][5]); // [[[I@hash_code

我可以通过执行String.valueOf(array).split("\\[").length - 1来找出该数组存在的确切维数。我不确定从这一点上我能做什么。

public int arraySum(final Object array) {
    checkArgument(array.getClass().isArray()); // from com.google.common.base.Preconditions
    final int dimensions = String.valueOf(array).split("\\[").length - 1;
    int sum = 0;

    // somehow loop n-times over here to count up

    return sum;
}

通常,在多维数组上进行迭代时,彼此之间会有多个循环,但是在我的情况下,我需要n个循环,而我显然不能对其进行硬编码。我该怎么办?

答案

以这种方式执行:

public static int arraySum(final Object[] array) {
    if(array.length == 0) return 0;
    return array.length * ((array[0] instanceof Object[]) ? arraySum((Object[]) array[0]) : 1);
}

您也可以为基元数组重载此方法。这是我如何以最少的代码重复来做到这一点:

private static int doArraySum(Object array) {
    if(array == null || !array.getClass().isArray()) return 1;
    int length = Array.getLength(array);
    if(length == 0) return 0;
    return length * doArraySum(Array.get(array, 0));
}

public static int arraySum(Object[] array) {
    return doArraySum(array);
}

public static int arraySum(int[] array) {
    return doArraySum(array);
}

// other primitives

如果子数组的长度可能不相等,则应使用加法而不是乘法:

private static int doArraySum(Object array) {
    if (array == null || !array.getClass().isArray()) return 1;
    return IntStream
            .range(0, Array.getLength(array))
            .map(i -> doArraySum(Array.get(array, i)))
            .sum();
}

示例:

int[][] array = new int[2][];
array[0] = new int[2];
array[1] = new int[3];
arraySum(array); // 5

以上是关于如何为数组的'n'个维循环?的主要内容,如果未能解决你的问题,请参考以下文章

Django - 你如何为每个'用户'分配'反馈'到一个'任务'? (多对一)

如何在JavaScript数组中选择最后一个元素

如何为 softmax 分类指定 onehot 标签数组的形状?

如何为C中的字符串数组赋值?

【SQL】如何为bit类型的参数取反呢?

如何为具有泛型类型的箭头函数编写流类型