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

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

此问题已在此处找到答案

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

  1. List<EmpData> data;
  2. class Emp {
  3. Integer id;
  4. String department;
  5. String action;
  6. // getters and setters
  7. }

我得到的数据如下:

  1. 1, Food, Add
  2. 1, Food, Remove
  3. 2, Food, Add
  4. 2, Auto, Remove
  5. 3, Electric, Add
  6. 3, Electric, Remove
  7. 3, Food, Remove

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

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

如何在Java8中筛选此列表?

dgjrabp2

dgjrabp21#

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

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

dsekswqp2#

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

  1. var sorted = list.stream().sort(Comparator.comparing(EmpData::getId).thenComparing(EmpData::getDepartment)).collect(Collectors.toList());
  2. for(int i = 0; i < sorted.size() - 1; i++){
  3. var next = sorted.at( i + 1 );
  4. var current = sorted.at( i );
  5. if(current.getId().equals(next.getId()) && current.getDepartment().equals(next.getDepartment())){
  6. sorted.remove(i);
  7. i--; // check for next element
  8. }
  9. }
jw5wzhpr

jw5wzhpr3#

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

相关问题