Java List集合去重的多种方法

简介: 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);
    }
目录
相关文章
|
18天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
37 3
|
1月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
48 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
54 4
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
59 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
32 1
|
7月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1097 1
|
6月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
6月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
|
7月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
255 3