Java List对象集合中 如何根据集合中对象某几个属性组合去重
Java List对象集合中 如何根据集合中对象某几个属性组合去重
在Java中,如果你想要根据一个List中的对象的几个属性进行去重,可以使用以下几种方法:
方法一:使用 Set 和自定义的 equals() 和 hashCode()
你可以创建一个自定义类,并为这个类实现equals()和hashCode()方法。然后使用HashSet来存储这些对象,因为HashSet不允许重复元素。
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保证插入顺序。
List<MyClass> distinctList = list.stream()
.collect(Collectors.toCollection(LinkedHashSet::new))
.stream()
.collect(Collectors.toList());```如果需要根据特定属性去重,可以使用distinct()结合Comparator或更复杂的逻辑。
方法三:使用 Collectors.groupingBy 和 findFirst
这种方法可以确保只保留每个组的第一个元素:
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对象本身。请注意这种方法可能不会保持元素的原始顺序。
扩展:java list集合三种去重方法
java list集合三种去重方法
public class ListDistinct <T>{
/**
* 通过set去重, 不打乱原有list的顺序
* list中相同的对象会被去重复
*
* @param List<T> list
* @return List<T>
* */
public List<T> distinctBySetOrder(List<T> list){
Set<T> set = new HashSet<T>();
List<T> newList = new ArrayList<T>();
for (T t :list) {
if(set.add(t)){
newList.add(t);
}
}
return newList;
}
/**
* 通过set去重, 顺序可能会乱
* list中相同的对象会被去重复
*
* @param List<T> list
* @return List<T>
* */
public List<T> distinctBySet(List<T> list){
return new ArrayList<T>(new HashSet<T>(list));
}
/**
* 通过遍历判断后将赋予新的集合
*
* @param List<T>
* @reutrn List<T>
* */
public List<T> distinctByANewList(List<T> list){
List<T> newList = new ArrayList<T>();
for(T t : list){
if(!newList.contains(t)){
newList.add(t);
}
}
return newList;
}
public static void main(String[] args){
ListDistinct<String> ld = new ListDistinct<String>();
List<String> list = new ArrayList<String>();
list.add("zhang");
list.add("zhang");
list.add("ss");
list.add("ss");
list.add("2s");
list.add("s3");
System.out.println("1:" + ld.distinctBySetOrder(list).toString());
System.out.println("2:" + ld.distinctBySet(list).toString());
System.out.println("3:" + ld.distinctByANewList(list).toString());
}
}到此这篇关于Java List对象集合中 如何根据集合中对象某几个属性组合去重的文章就介绍到这了,更多相关java list集合对象去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详谈HashMap和ConcurrentHashMap的区别(HashMap的底层源码)
下面小编就为大家带来一篇详谈HashMap和ConcurrentHashMap的区别(HashMap的底层源码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-08-08
springboot 如何修改默认端口及application.properties常用配置
这篇文章主要介绍了springboot 如何修改默认端口及application.properties常用配置操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
使用Lombok导致打印的tostring中缺少父类的属性问题
使用Lombok时,若发现@Data注解的@ToString不包含父类属性,可通过添加@ToString(callSuper=true)解决,此方法确保在生成toString()时包括父类的属性,有效解决只打印子类属性的问题,这种做法对于需要完整信息展示的场景尤为重要2024-11-11
Eclipse设置svn忽略文件或文件夹(svn:ignore)的操作
这篇文章主要介绍了Eclipse设置svn忽略文件或文件夹(svn:ignore)的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-01-01
SpringBoot雪花算法主键ID传到前端后精度丢失问题的解决
本文主要介绍了SpringBoot雪花算法主键ID传到前端后精度丢失问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08
解决IDEA Maven下载依赖时报错ERROR - #org.jetbrains.ide
这篇文章主要介绍了解决IDEA Maven下载依赖时报错ERROR - #org.jetbrains.idea.maven - Cannot reconnect.问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08


最新评论