利用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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值