List 对象去重 案例

多个 List 合并之去重 (Java)

场景 : 一个列表集合需要合并多个列表,且不能出现重复的元素.
例子 : 权限业务, 一个账号有多个角色 . 每个角色有不同的权限,其中不同角色之间可能会出现重复的权限.

方案 :

(一) 代码 : (效率高 , 利用集合特性合并去重一步到位)

Set<Object> set = new HashSet(); //合集
List<Object> listA = new ArrayList<>(); //A集合
List<Object> listB = new ArrayList<>(); //B集合
set.addAll(listA);
set.addAll(listB);

(二) 代码 : (效率低 , 代码繁多)

A(合集)    B(集合)     C(集合)
先分别把 BC集合的元素单个添加至 A集合,在来判断 value 是否相等来达到去重的效果(如果是对象类型的话会多一步).


(三) 代码 : (效率低 , 代码比二少)
使用List 的 addAll() 方法, 然后在去重.


附 : 对象去重需要相应的去重对象重写 hashcode() 与 equals()方法.
因为Object 的 equals() 方法是比较内存地址 两个对象的内存地址当然不相等,但是对象的值是相同的,所以得重写equals()方法,为什么要重写hashcode()呢,虽然此处比较只用到了equals()方法,但是当对象用到Hash相关的包后,需要用到hashcode()方法来判断就会造成相等对象但是不相等的哈希码,所以规定要一起重写. 对象去重的不重写比较方法的话还可以使用比较器来实现: (例子)

Set<Object>  rs = new TreeSet<Object>(new Comparator<Object>() {
    
    
       @Override
       public int compare(Object a1, Object a2) {
    
    
          return a1.getValue().compareTo(a2.getValue());
       }
});
通过比较对象的Value属性来判断是否相等.

可以参考这篇文章 : 点我

附二: 方法二利用流式操作

//实体对象
public class AreaInfo{
    
    
	private String provinceCode;
	private String name;
}

List<AreaInfo> list =  new ArrayList<>();
......省略添加重复对象数据代码

//------------------[根据属性(provinceCode)去重]----------------
List<AreaInfo> provinces = list.stream().collect(collectingAndThen(
                    toCollection(() -> new TreeSet<AreaInfo>(
                            comparing(areaInfo->areaInfo.getProvinceCode()))),ArrayList::new));

小伙伴还有新的想法可以在评论区留言哦!

猜你喜欢

转载自blog.csdn.net/AKALXH/article/details/116223946