给定一个多维整数数组,如何找到所有基本元素的总和?每个数组中可能有不同数量的数组,因此我的算法必须灵活以适应所有可能的输入。递归方法似乎是最优雅的解决方案。示例:
给定:
array = {
{{1,2,3},
{4,5},
{6,7,8}},
{{9},{10}}
}
返回:
55
注意,每个子数组的长度不一致且各不相同,数组的深度也是如此。这意味着传统循环无法检查数组的长度,递归方法也无法定义循环的维数作为初始参数。也许递归循环需要将 Object
转换为数组?
编辑:
该方法还应该能够对任意维数的数组求和。例如,输入数组可以具有三个维度,甚至 7 个维度。
最佳答案
使用 Java Streams,您可以使用这个(假设您的数组有 2 维):
int[][] array = {{1, 2, 3}, {4, 5}, {6, 7, 8}, {9, 10}};
int sum = Arrays.stream(array)
.flatMapToInt(Arrays::stream)
.sum();
如果您的数组有 3 个维度,您可以将其扩展为以下维度:
int[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = Arrays.stream(array)
.flatMap(Arrays::stream)
.flatMapToInt(Arrays::stream)
.sum();
要处理深度未知的数组,您可以使用此方法来展平它们:
private static Stream<Object> flatMapDynamicArray(Object[] array) {
return Arrays.stream(array)
.flatMap(o -> o.getClass().isArray() ?
flatMapDynamicArray((Object[]) o) :
Stream.of(o));
}
您还可以使用o instanceof Object[]
代替o.getClass().isArray()
,但对于我的测试,第二个具有更好的性能。
像这样使用这个方法:
Integer[][][] array = {{{1, 2, 3}, {4, 5}, {6, 7, 8}}, {{9}, {10}}};
int sum = flatMapDynamicArray(array)
.mapToInt(i -> (int) i)
.sum();
对于您共享的数组,所有情况下的结果均为 55
。
关于java - Java中随机嵌套数组的基本元素求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56820423/