java 8过滤列表中的重复对象

js4nwp54  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(384)

此问题已在此处找到答案

java 8如何获取多个属性的不同列表(3个答案)
三天前关门。
我有一个arraylist:

List<EmpData> data;

class Emp {

    Integer id;
    String department;
    String action;

    // getters and setters
}

我得到的数据如下:

1, Food, Add
1, Food, Remove
2, Food, Add
2, Auto, Remove
3, Electric, Add
3, Electric, Remove
3, Food, Remove

我想删除id和部门相同的所有记录。
那是给empid的 1 那里&部门 food ,有2条记录,请删除它们。
这样,结果列表将只包含:

2, Food, Add
2, Auto, Remove
3, Food, Remove

如何在Java8中筛选此列表?

dgjrabp2

dgjrabp21#

首先,构建id/部门组合存在多少次的Map。
然后删除计数大于1的所有条目。
例子

List<EmpData> data = List.of();

TreeMap<EmpData, Long> counts = data.stream().collect(Collectors.groupingBy(
        Function.identity(),
        () -> new TreeMap<>(Comparator.comparing(EmpData::getId)
                                  .thenComparing(EmpData::getDepartment)),
        Collectors.counting()));
data.removeIf(e -> counts.get(e) > 1);
dsekswqp

dsekswqp2#

您可以对其进行排序,然后删除所有后续的:

var sorted = list.stream().sort(Comparator.comparing(EmpData::getId).thenComparing(EmpData::getDepartment)).collect(Collectors.toList());

for(int i = 0; i < sorted.size() - 1; i++){
   var next = sorted.at( i + 1 );
   var current = sorted.at( i );
   if(current.getId().equals(next.getId()) && current.getDepartment().equals(next.getDepartment())){
      sorted.remove(i);
      i--; // check for next element
   }
}
jw5wzhpr

jw5wzhpr3#

data.stream().distinct().collect(Collectors.toList());

相关问题