利用TreeSet对List中的对象按照特定字段去重(不要同时去重和修改数据)

需求是对List中的Object中某些字段相同的进行去重,这里可以利用SetComparator进行比较后去重

package com.liying.banana.user;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import com.liying.banana.order.vo.OrderVO;

/**
 * List集合中的对象按照某个字段去重实现
 * 
 * @author jqlin
 *
 */
public class DuplicateOrderTest {
    public static void main(String[] args) {
        List<OrderVO> orderList = new ArrayList<OrderVO>();
        OrderVO orderVO = new OrderVO();
        orderVO.setOrderNo("11");
        orderVO.setUserId("aa");
        orderList.add(orderVO);

        orderVO = new OrderVO();
        orderVO.setOrderNo("22");
        orderVO.setUserId("bb");
        orderList.add(orderVO);

        orderVO = new OrderVO();
        orderVO.setOrderNo("33");
        orderVO.setUserId("aa");
        orderList.add(orderVO);
        
        List<OrderVO> dataList = removeDuplicateOrder(orderList);
        for(OrderVO data : dataList){
            System.out.println(data.getOrderNo() + ":" + data.getUserId());
        }
    }

    /**
     * 去重
     * 
     * @param orderList
     * @return
     * @author jqlin
     */
    private static List<OrderVO> removeDuplicateOrder(List<OrderVO> orderList) {
        Set<OrderVO> set = new TreeSet<OrderVO>(new Comparator<OrderVO>() {
            @Override
            public int compare(OrderVO a, OrderVO b) {
                // 字符串则按照asicc码升序排列
                //多个字段的话可以拼接一下后比较两个字符串
                //String key1 = "aaa" + "bbb";
                //String key2 = "bbb" + "ccc";
                //按照这个key值升序升序
                //return key1.compareTo(key2)
                return a.getUserId().compareTo(b.getUserId());
            }
        });
        //这里要注意当orderList集合大小只有1的时候其实没必要去重,就一个元素还去啥重
        //注意点2,虽然比较器中 = 0的会被判定相同,但是Set在去重的时候会按照 orderList 中元素的顺序来去重,可能最后拿到的不是你想要的结果,这里要慎重.比如说我们想要 orderList 去重后 quantity最大的那个元素,但是orderList中 quantity 最小的元素排在第一位,那么后面再根据 自定义的compare比较的时候会把后面我们要的quantity最大的那个元素丢弃掉
        //建议只用于去重,不要同时去重和修改数据
        set.addAll(orderList);
        return new ArrayList<OrderVO>(set);
    }
}

执行结果:

11:aa
22:bb

参考自大佬的博客
https://www.cnblogs.com/linjiqin/p/7724390.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用和引用,我们可以使用Java的多种方法来根据字段List对象。对于给定的List对象,我们可以使用以下方法之一进行去: 1. 使用Set集合:将List对象转换为Set集合,由于Set集合不允许元素复,复的元素将被自动去。以下是一个示例代码段: ```java Set<TestBean> uniqueSet = new HashSet<>(list); List<TestBean> deduplicatedList = new ArrayList<>(uniqueSet); ``` 2. 使用Stream API:通过使用Stream API的distinct()方法根据特定字段进行去。以下是一个示例代码段: ```java List<TestBean> deduplicatedList = list.stream() .distinct() .collect(Collectors.toList()); ``` 3. 使用TreeSet集合:通过使用TreeSet集合和自定义比较器根据特定字段进行去。以下是一个示例代码段: ```java List<TestBean> deduplicatedList = new ArrayList<>(new TreeSet<>(Comparator.comparing(TestBean::getName))); deduplicatedList.addAll(list); ``` 这些方法都可以根据字段List对象,具体使用哪种方法取决于你的需求和偏好。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java List 根据对象的某个字段进行去](https://blog.csdn.net/u012861744/article/details/115125869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JavaList集合对象及按属性去的8种方法](https://download.csdn.net/download/weixin_38624556/12822011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值