Comparable 和comparator

本文详细介绍了如何使用Java的Comparable接口和Comparator类对集合中的自定义对象进行排序,包括具体实现步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1) Comparable的用法
对于集合里面的自定义对象,如果想对他们排序,只需三步:
(1)先实现java.lang.Comparable接口;
(2)并实现里里面的比较接口compareTo(Object o);
(3)然后我们只要调用公共类库java.util.Collections这个类的sort(List list)方法,Java就会按照它的一套方法对list集合里面的对象排列先后次序.示例如下:
public class Student implements Comparable<Student> {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        return new Integer(age).compareTo(new Integer(o.getAge()));
    }
}

public static void main(String[] args) {

        List<Student> studentList=new ArrayList<Student>();

        Student student=new Student();
        student.setName("lili_3");
        student.setAge(13);
        studentList.add(student);

        Student student_one=new Student();
        student_one.setName("lili");
        student_one.setAge(12);
        studentList.add(student_one);

        Student student_two=new Student();
        student_two.setName("lili_2");
        student_two.setAge(10);
        studentList.add(student_two);

        Collections.sort(studentList);
    }
(2) Comparator的用法
在现实生活中我们会遇到这样一个问题就是同样一种类型的对象之间可能会按着不同的规则进行排序,
(1)Java里面给我们提供了一个比较器java.util.Comparator,我们只要在比较器中定义它所比较的两个对象之间的比较规则即可。
(2)然后同样调用公共类库中java.util.Collections这个类的sort(List list, Comparator c)方法,或者使用TreeMap容器排序都可以;
public class CartItemDTO {

    private SkuDTO sku;

    private Long lastUpdateTime;


    public Long getLastUpdateTime() {
        return lastUpdateTime;
    }

    public void setLastUpdateTime(Long lastUpdateTime) {
        this.lastUpdateTime = lastUpdateTime;
    }
}
public class SkuDTO {
    /**
     * 商品ID
     */
    private Long itemId;

    /**
     * 卖家Id
     */
    private Long sellerUserId;

    public Long getItemId() {

        return itemId;
    }
    public void setItemId(Long itemId) {
        this.itemId = itemId;
    }
    public Long getSellerUserId() {
        return sellerUserId;
    }

    public void setSellerUserId(Long sellerUserId) {
        this.sellerUserId = sellerUserId;
    }
}
public class sortImpl {
    public Map<Long, List<CartItemDTO>> getSortCartItem(List<CartItemDTO> cartItemDTOs) {
        //按店铺分组
        Map<Long, List<CartItemDTO>> sellerUserMap = sortBySellerUser(cartItemDTOs);
        //根据店铺内商品最新更新时间排序
        GroupSortCartComparator groupSortCartComparator = new GroupSortCartComparator(sellerUserMap);
        //第一种:容器排序
        TreeMap<Long, List<CartItemDTO>> sellerMap = new TreeMap<Long, List<CartItemDTO>>(groupSortCartComparator);
        sellerMap.putAll(sellerUserMap);
        //店铺内排序 按照商品更新时间排序
        SkuComparator skuComparator = new SkuComparator();
        for (Map.Entry<Long, List<CartItemDTO>> pair : sellerUserMap.entrySet()) {
                //第二种排序
            **Collections.sort(pair.getValue(), skuComparator);**
        }
        }
        return sellerUserMap;
    }

    /**
     * 按照店铺分组
     *
     * @param cartItemDTOs
     * @return
     */
    public Map<Long, List<CartItemDTO>> sortBySellerUser(List<CartItemDTO> cartItemDTOs) {
        Map<Long, List<CartItemDTO>> sellerUserMap = new HashMap<Long, List<CartItemDTO>>();
        for (CartItemDTO cartItemDTO : cartItemDTOs) {
            Long sellerUserId = cartItemDTO.getSku().getSellerUserId();
            if (sellerUserMap.containsKey(sellerUserId)) {
                sellerUserMap.get(sellerUserId).add(cartItemDTO);
            } else {
                List<CartItemDTO> cartItemList = new ArrayList<CartItemDTO>();
                cartItemList.add(cartItemDTO);
                sellerUserMap.put(sellerUserId, cartItemList);
            }
        }
        return sellerUserMap;

    }


    /**
     * 自定义比较器 根据店铺内商品最新更新时间排序
     */

    class GroupSortCartComparator implements Comparator<Long> {

        public Map<Long, List<CartItemDTO>> base;

        public GroupSortCartComparator(Map<Long, List<CartItemDTO>> cartItem) {
            this.base = cartItem;

        }

        @Override
        public int compare(Long o1, Long o2) {
            List<CartItemDTO> cartItemDTOs_one = base.get(o1);
            List<CartItemDTO> cartItemDTOs_two = base.get(o2);

            Long lastUpdateTime_one = getLastUpdateTime(cartItemDTOs_one);
            Long lastUpdateTime_two = getLastUpdateTime(cartItemDTOs_two);
            if (lastUpdateTime_one < lastUpdateTime_two) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    /**
     * 获取店铺中商品的最新更新时间
     *
     * @param cartItemDTOList
     * @return
     */
    public Long getLastUpdateTime(List<CartItemDTO> cartItemDTOList) {

        Long lastUpdateTime = 0L;
        if (cartItemDTOList.get(0).getLastUpdateTime() != null) {
            lastUpdateTime = cartItemDTOList.get(0).getLastUpdateTime();
        }
        for (CartItemDTO cartItemDTO : cartItemDTOList) {
            Long updateTime = cartItemDTO.getLastUpdateTime() != null ? cartItemDTO.getLastUpdateTime() : 0L;
            if (lastUpdateTime < updateTime) {
                lastUpdateTime = updateTime;
            }

        }
        return lastUpdateTime;


    }

    /**
     * 对店铺内的商品按照商品的更新时间排序
     */
    class SkuComparator implements Comparator<CartItemDTO> {
        @Override
        public int compare(CartItemDTO o1, CartItemDTO o2) {
            Long updateTime_one = o1.getLastUpdateTime();
            Long updateTime_two = o2.getLastUpdateTime();
            if (updateTime_one < updateTime_two) {
                return 1;
            } else {
                return -1;
            }

        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值