java - Java中随机嵌套数组的基本元素求和?

标签 java arrays sum

给定一个多维整数数组,如何找到所有基本元素的总和?每个数组中可能有不同数量的数组,因此我的算法必须灵活以适应所有可能的输入。递归方法似乎是最优雅的解决方案。示例:

给定:

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/

相关文章:

arrays - 在给定一些约束的情况下,如何找到数组的最大子集?

c - 为什么我们需要使用双指针来访问二维数组?

MySQL SUM column1 如果 column2 等于今天并且 column3 等于特定测试

Python循环中操作数据List

java - 包装对静态方法/变量的访问的模式名称是什么?

java - Java中如何判断图像是横向还是纵向?

java - 无法加载事件数据 - 使用 Java 发送 .ics 时在 gmail 中

javascript - 为什么我只获取从 Silverlight 传递的 Javascript 数组中的第一个元素?

java - 实现没有拆分包的(编译时)插件架构

python - 在 Pandas Dataframe 单元格中查找 [Python 列表] 的匹配值之和?