Java List集合去重的多种实现方法

 更新时间:2025年02月18日 09:15:35   作者:赵广陆  
Java中List集合去重的多种方法,包括使用循环、HashSet、保持顺序去重、contain方法去重等,注意在删除元素时,直接操作会导致ConcurrentModificationException,应使用传统for循环或倒序删除

Java List集合去重的多种方法

1 循环list中的所有元素然后删除重复

/**
* 循环list中的所有元素然后删除重复
* @param list 待去重的list
* @return 去重后的list
*/
public static <T> List<T> removeDuplicate(List<T> list){
  for(int i=0;i<list.size()-1;i++){
      for(int j=list.size()-1;j>i;j--){
          if (list.get(j).equals(list.get(i))){
              list.remove(j);
          }
      }
  }
  return list;
}

2 通过HashSet去重

/**
 * 通过HashSet去重
 * @param list 待去重的list
 * @return 去重后的list
 */
public static <T> List<T> removeDuplicateHashSet(List<T> list){
    HashSet<T> hs = new HashSet<>(list);
    list.clear();
    list.addAll(hs);
    return list;
}

3 删除List中重复元素,并保持顺序

/**
 * 删除List中重复元素,并保持顺序
 * @param list 待去重的list
 * @return 去重后的list
 */
public static <T> List<T> removeDuplicateKeepOrder(List<T> list){
    Set set = new HashSet();
    List<T> newList = new ArrayList<>();
    for (T element : list) {
        //set能添加进去就代表不是重复的元素
        if (set.add(element)) newList.add(element);
    }
    list.clear();
    list.addAll(newList);
    return list;
}

4 利用list.contain() 去重

/**
 * 利用list.contain() 去重
 * @param list
 * @return
 */
public static <T> List<T> removeDuplicateContain(List<T> list){
    List<T> listTemp = new ArrayList<>();
    for (T aList : list) {
        if (!listTemp.contains(aList)) {
            listTemp.add(aList);
        }
    }
    return listTemp;
}

5 注意事项

删除的时候size或者长度也在发生变化,这样会造成少删除,也可用Stream流进行过滤删除

List filterList = list.stream().filter(user -> user.getAge() >= 40)        .collect(toList());

例子:

JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody());
        String content = jsonObject.getString("content");
        JSONArray jsonArray = JSONObject.parseArray(content);
        for (int i = jsonArray.size() - 1; i >= 0; i--) {
            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
            String caseId = jsonObject1.getString("caseId");
            QueryWrapper queryWrapper=new QueryWrapper();
            queryWrapper.eq("user_id",caseInfoQueryParam.getUserId());
            queryWrapper.eq("case_id",caseId);
            queryWrapper.last("limit 1");
            CaseInfo caseInfo = caseInfoMapper.selectOne(queryWrapper);
            logger.info("案件绑定详情去重的案件->{}",caseInfo);
            if (caseInfo!=null){
                jsonArray.remove(i);
            }
        }

6 利用stream分组及去重

分组

classEntities.stream().collect(Collectors.groupingBy(ClassEntity::getGrade));

java8去重(根据年级和专业,当年级和专业都相同的情况下看做是重复数据)

List<ClassEntity> distinctClass = classEntities.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getProfessionId() + ";" + o.getGrade()))), ArrayList::new));

通过hashSet去重(如将classNames去重):该种去重是bean完全相同的时候算重复数据

List<String> classNameList = new ArrayList(new HashSet(classNames));

7 删除集合中多个元素

因为stream遍历的底层还是迭代器所以就不能边遍历边删除会出现异常ConcurrentModificationException,所以用传统for循环删除,一种删除是倒着删,另一种就是删除后重新倒退一位标志位

    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList();
        arrayList.add("111");
        arrayList.add("222");
//        arrayList.stream().forEach(s -> {
//            arrayList.remove(s);
//                    System.out.println(arrayList.size());
//                }
//        );
        for (int i = 0; i < arrayList.size(); i++) {
            arrayList.remove(i);
            i--;
        }
        System.out.println(arrayList);
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 特殊数据结构之使用Java实现单调栈示例

    特殊数据结构之使用Java实现单调栈示例

    这篇文章主要为大家介绍了特殊数据结构之使用Java实现单调栈示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Jmeter内置变量vars和props的使用详解

    Jmeter内置变量vars和props的使用详解

    JMeter是一个功能强大的负载测试工具,它提供了许多有用的内置变量来支持测试过程,其中最常用的变量是 vars 和 props,本文通过代码示例详细给大家介绍了Jmeter内置变量vars和props的使用,需要的朋友可以参考下
    2024-08-08
  • Java类加载之Class对象到Klass模型详解

    Java类加载之Class对象到Klass模型详解

    这篇文章主要介绍了Java类加载之Class对象到Klass模型详解,每一个Java类在JVM中都会对应创建一个C++类实例,我们称这个C++类为Klass实例,Klass实例里面存储了java类中所描述的方法、字段、属性等,需要的朋友可以参考下
    2023-08-08
  • 基于java中的null类型---有关null的9件事

    基于java中的null类型---有关null的9件事

    这篇文章主要介绍了java中的null类型---有关null的9件事,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 关于maven工程多模块、项目打包问题

    关于maven工程多模块、项目打包问题

    这篇文章主要介绍了关于maven工程多模块、项目打包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Spring事务管理中关于数据库连接池详解

    Spring事务管理中关于数据库连接池详解

    事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就 回退到事务开始未进行操作的状态。事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分情况下也都需要使用事务
    2022-12-12
  • springcloud Zuul动态路由的实现

    springcloud Zuul动态路由的实现

    这篇文章主要介绍了springcloud Zuul动态路由的实现,详细的介绍了什么是Zuu及其动态路由的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • JPA-JpaRepository方法命名语法说明

    JPA-JpaRepository方法命名语法说明

    这篇文章主要介绍了JPA-JpaRepository方法命名语法说明,具有很好的参考价值。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring中的FactoryBean与ObjectFactory详解

    Spring中的FactoryBean与ObjectFactory详解

    这篇文章主要介绍了Spring中的FactoryBean与ObjectFactory详解,FactoryBean是一种特殊的bean,本身又是个工厂,实现了FactoryBean的bean会被注册到容器中,需要的朋友可以参考下
    2023-12-12
  • SpringCloud启动eureka server后,没报错却不能访问管理页面(404问题)

    SpringCloud启动eureka server后,没报错却不能访问管理页面(404问题)

    这篇文章主要介绍了SpringCloud启动eureka server后,没报错却不能访问管理页面(404问题),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论