首页 > 解决方案 > 在二维数组中选择最小 ID 时删除重复行

问题描述

我有以下二维数组:

ID  Site  Place
1.0 222.23 333.23
2.0 222.0  311.11
3.0 22.23  111.2
0.0 222.23 333.23
4.0 22.23  121.1
1.0 222.23 333.23
5.0 222.23 333.23

我想删除任何具有相同站点和地点的行并选择最小的 ID。对于我给定的二维数组,输出应该是:

 ID  Site  Place
2.0 222.0  311.11
3.0 22.23  111.2
0.0 222.23 333.23
4.0 22.23  121.1

我曾尝试循环执行此操作,但花费的时间太长。我还创建了另一种方法(请参见下面的代码),但仅删除精确副本。一个带有简单解释的代码片段将不胜感激。

public static void main(String[]args){
        Double[][] loc_t = {
                {1.0,222.23,333.23},
                {2.0, 222.00, 311.11},
                {3.0, 22.23, 111.2},
                {0.0, 222.23, 333.23},
                {4.0, 22.23, 121.1},
                {1.0, 222.23, 333.23},
                {5.0, 222.23, 333.23},
                
 };
        System.out.println("ID Site  Place");
        Arrays.stream(loc_t)
              .map(Arrays::asList)
              .distinct()
              .forEach(row -> System.out.printf("%-3s%-7s%s\n", row.get(0), row.get(1), row.get(2)));
}

标签: javaarraysmultidimensional-array

解决方案


真正的 distinct 只会确保值是唯一的,因此您将无法删除重复的项目。

以下收集项目并计算数量'filter(e -> e.getValue()== 1)'确保只有计数为1的项目将被允许在流输出中进行收集。

        Arrays.stream(loc_t)
            .map(Arrays::asList)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
            .entrySet()
            .stream()
            .filter(e -> e.getValue() == 1)
            .map(e -> e.getKey())
            .collect(Collectors.toList())
            .forEach(row -> System.out.printf("%s, %s, %s\n", row.get(0), row.get(1), row.get(2)));

推荐阅读