Java 8 过滤列表中的重复对象
Java 8 filter duplicate objects in a list
我有一个 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 和部门相同的记录。
那是 For EmpId 1
there & department food
, 有 2 条记录所以删除它们。
这样生成的列表将只包含:
2, Food, Add
2, Auto, Remove
3, Food, Remove
如何在 java 8 中过滤此列表?
嗯,你可以排序,然后删除所有后续的:
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
}
}
data.stream().distinct().collect(Collectors.toList());
首先,构建一个 Id/Department 组合存在次数的地图。
然后删除所有计数大于 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);
我有一个 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 和部门相同的记录。
那是 For EmpId 1
there & department food
, 有 2 条记录所以删除它们。
这样生成的列表将只包含:
2, Food, Add
2, Auto, Remove
3, Food, Remove
如何在 java 8 中过滤此列表?
嗯,你可以排序,然后删除所有后续的:
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
}
}
data.stream().distinct().collect(Collectors.toList());
首先,构建一个 Id/Department 组合存在次数的地图。
然后删除所有计数大于 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);