gpt4 book ai didi

java - 如何循环获取数组的 'n' 维度?

转载 作者:行者123 更新时间:2023-12-02 09:25:41 26 4
gpt4 key购买 nike

我正在尝试创建一个方法来总结潜在的项目并从数组返回该总和。以下是一些预期的示例输入:

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

关于java - 如何循环获取数组的 'n' 维度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58358729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com