对 List<T> 集合对象根据某个字段去重的方法

(1)使用 java8 自带的方法即可:(推荐使用该方法)

List<User> lists = 从某处得来的集合;
lists = lists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getXxx))), ArrayList::new));

这样得到的集合 lists,就是去重后的集合了!

(2)还有一种方法,但是该方法有时返回的集合正确,有时不正确。(慎重使用!)


private static List<User> getDistinctInfo(List<User> list) {
    Set<User> set = new TreeSet<>(new Comparator<User>() {
        @Override
            public int compare(User o1, User o2) {
        int compareToResult = 1;//==0表示重复
                if(StringUtils.equals(o1.getXxx().toString(), o2.getXxx().toString())) {
                    compareToResult = 0;
                }
                return compareToResult;
        }
        });
        set.addAll(list);
        return new ArrayList<>(set);
}
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,对于一个对象集合,如果想要根据某个字段进行去重,可以使用`Stream`的`distinct`方法结合`map`方法来实现。 假设我们有一个`List<Person>`类型的列表,其中`Person`类包含`name`和`age`两个字段,现在想要根据`name`字段进行去重,可以按照以下步骤进行操作: 1. 使用`map`方法将`Person`对象映射为其`name`字段; 2. 使用`distinct`方法对`name`字段进行去重; 3. 使用`map`方法将`name`字段转换为`Person`对象。 具体实现代码如下: ``` List<Person> list = Arrays.asList( new Person("Tom", 20), new Person("Jerry", 22), new Person("Tom", 25), new Person("Alice", 18), new Person("Jerry", 23) ); List<Person> result = list.stream() .map(Person::getName) // 映射为name字段 .distinct() // 根据name字段进行去重 .map(name -> list.stream() .filter(person -> person.getName().equals(name)) .findFirst() .orElse(null)) // 转换为Person对象 .collect(Collectors.toList()); System.out.println(result); ``` 输出结果为: ``` [Person{name='Tom', age=20}, Person{name='Jerry', age=22}, Person{name='Alice', age=18}] ``` 在这个例子中,我们首先使用`map`方法将`Person`对象映射为其`name`字段,然后使用`distinct`方法对`name`字段进行去重。最后使用另一个`map`方法将`name`字段转换为`Person`对象。注意,这里使用了`findFirst`方法来获取第一个符合条件的`Person`对象,如果找不到则返回`null`。 需要注意的是,这种做法的时间复杂度为O(n^2),因为在第三个`map`方法中,每次都需要对原始列表进行一次遍历。因此,如果列表非常大,建议使用其他更高效的数据结构或算法来实现去重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值