在Java中,如果你想要根据一个List中的对象的几个属性进行去重,可以使用以下几种方法:
方法一:使用 Set 和自定义的 equals() 和 hashCode()
你可以创建一个自定义类,并为这个类实现equals()和hashCode()方法。然后使用HashSet来存储这些对象,因为HashSet不允许重复元素。
java
class MyClass {
private String attr1;
private String attr2;
// 构造函数
public MyClass(String attr1, String attr2) {
this.attr1 = attr1;
this.attr2 = attr2;
}
// getter 和 setter 省略...
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
MyClass other = (MyClass) obj;
return attr1.equals(other.attr1) && attr2.equals(other.attr2);
}
@Override
public int hashCode() {
return attr1.hashCode() ^ attr2.hashCode();
}
}
// 使用示例
List<MyClass> list = new ArrayList<>();
// 填充list...
Set<MyClass> set = new HashSet<>(list);
list.clear();
list.addAll(set); // 去重后的list
方法二:使用 Java 8 及以上版本的 Stream API
利用Java 8的Stream API,可以简化代码。通过收集器Collectors.toCollection()与LinkedHashSet保证插入顺序。
java
List<MyClass> distinctList = list.stream()
.collect(Collectors.toCollection(LinkedHashSet::new))
.stream()
.collect(Collectors.toList());```
如果需要根据特定属性去重,可以使用distinct()结合Comparator或更复杂的逻辑。
方法三:使用 Collectors.groupingBy 和 findFirst
这种方法可以确保只保留每个组的第一个元素:
java
Map<String, MyClass> result = list.stream()
.collect(Collectors.toMap(
o -> o.getAttr1() + o.getAttr2(), // key generator
Function.identity(), // value mapper
(oldValue, newValue) -> oldValue // merge function
));
List<MyClass> distinctList = new ArrayList<>(result.values());
这里,键是属性组合的字符串表示形式,而值则是MyClass对象本身。请注意这种方法可能不会保持元素的原始顺序。