java中 List集合对象去重及按属性去重的8种方法


List集合对象去重及按属性去重的8种方法


最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大。基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华。所以我更想把java相关的基础知识进行穿针引线,进行整体上的总结。

  • 总结java中创建并写文件的5种方式
  • 总结java从文件中读取数据的6种方法
  • 总结java创建文件夹的4种方法及其优缺点
  • 总结java中删除文件或文件夹的7种方法
  • 总结java中文件拷贝剪切的5种方式

比如之前我已经写了上面的这些内容,如果对java基础知识总结系列感兴趣的同学可以关注我的博客(文末给出我的博客地址)

一、本文梗概

下文中四种方法对List中的String类型以集合元素对象为单位整体去重。如果你的List放入的是Object对象,需要你去实现对象的equals和hashCode方法,去重的代码实现方法和List去重是一样的。

第一种方法

是大家最容易想到的,先把List数据放入Set,因为Set数据结构本身具有去重的功能,所以再将SET转为List之后就是去重之后的结果。这种方法在去重之后会改变原有的List元素顺序,因为HashSet本身是无序的,而TreeSet排序也不是List种元素的原有顺序。

@Test
void testRemove1()  {
  /*Set set = new HashSet<>(list);
  List newList = new ArrayList<>(set);*/

//去重并排序的方法(如果是字符串,按字母表排序。如果是对象,按Comparable接口实现排序)

//List newList = new ArrayList<>(new TreeSet<>(list));

//简写的方法

List<String> newList = new ArrayList<>(new HashSet<>(list));

System.out.println( "去重后的集合: " + newList);

控制台打印结果如下:

去重后的集合: [kobe, james, zimug, curry]

第二种方法

使用就比较简单,先用stream方法将集合转换成流,然后distinct去重,最后在将Stream流collect收集为List。

@Test
void testRemove2()  {
  List<String> newList = list.stream().distinct().collect(Collectors.toList());
System.out.println( "去重后的集合: " + newList);

控制台打印结果如下:

去重后的集合: [kobe, james, curry, zimug]

第三种方法
这种方法利用了set.add(T),如果T元素已经存在集合中,就返回false。利用这个方法进行是否重复的数据判断,如果不重复就放入一个新的newList中,这个newList就是最终的去重结果

//三个集合类list、newList、set,能够保证顺序
@Test
void testRemove3()  {

Set set = new HashSet<>();

List newList = new ArrayList<>();

for (String str :list) {

if(set.add(str)){ //重复的话返回false

newList.add(str);

System.out.println( "去重后的集合: " + newList);

控制台打印结果和第二种方法一致。

第四种方法
这种方法已经脱离了使用Set集合进行去重的思维,而是使用newList.contains(T)方法,在向新的List添加数据的时候判断这个数据是否已经存在,如果存在就不添加,从而达到去重的效果。

//优化 List、newList、set,能够保证顺序
@Test
void testRemove4() {

List<String> newList = new ArrayList<>();

for (String cd:list) {

if(!newList.contains(cd)){ //主动判断是否包含重复元素

newList.add(cd);

System.out.println( "去重后的集合: " + newList);

控制台打印结果和第二种方法一致。

三、按照集合元素对象属性去重

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端分离RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》