将2D Java数组中的整数值分组并求和相关值

时间:2019-02-08 18:35:29

标签: java arrays multidimensional-array integer

我已经在java中创建了一个2D整数数组,并打印了以下内容

1122, 10, 20

3344, 20, 30

1122, 20, 20

1122, 10, 10

3344, 10, 40

我现在尝试遍历以上内容并创建一个新的2D数组。我想对第一列进行分组,并对与第一列中的数字关联的其他整数值求和,以得到这样的结果数组:

1122, 40, 50

3344, 30, 70

实现这一目标的最佳方法是什么?

------ 编辑 ------

使用下面的第二个答案,我已经能够生成一个嵌套列表,如下所示:

[1122, 40, 50]

[3344, 30, 70]

是否可以直接将结果作为2D整数数组供我使用和操作,而不是使用嵌套列表?

我试图用下面的代码转换嵌套列表,但是无法成功编译它。

int[][] collectarray = new int[collect.size()][];

for (int i = 0; i < collectarray.length; i++) {

 collectarray[i] = new int[collect.get(i).size()];

}

for (int i = 0; i < collect.size(); i++) {

 for (int j = 0; j < collect.get(i).size(); j++) {

  collectarray[i][j] = collect.get(i).get(j);

 }

}

2 个答案:

答案 0 :(得分:1)

这是流API的解决方案:

List<int[]> collect = Arrays.stream(arr)
    .collect(Collectors.groupingBy(ints -> ints[0]))
    .entrySet().stream()
    .map(entry -> new int[]{
        entry.getKey(),   // [0]
        entry.getValue().stream().mapToInt(value -> value[1]).sum(), // [1]
        entry.getValue().stream().mapToInt(value -> value[2]).sum()  // [2]
    })
    .collect(Collectors.toList());

并打印结果

collect.forEach(ints -> System.out.println(Arrays.toString(ints)));

更新

如果要直接在2D数组中获取结果,可以使用toArray()代替.collect(Collectors.toList());

int[][] collect = Arrays.stream(arr)
    ...
    ...
    .toArray(int[][]::new);

答案 1 :(得分:0)

我会使用地图将项目保留在第一列中。搜索该内容,如果存在,则添加要添加的值。如果不存在,则添加新值。遍历数组后,然后遍历地图。