Java中TreeSet集合中Comparable和Comparator对比

我们首先了解一个TreeSet集合(也是一个可排序集合)

①底层是一个TreeMap的数据结构

②TreeMap底层是一个二叉树的数据结构

③放到TreeSet集合中的元素,等同于放到TreeMap集合key部分

④TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序下面


我们来看看第四条,究竟是怎么可排序的

要求:当年龄一样的时候,按照姓名的首字母排序

/*这里加泛型之后,下面的comparaTo方法才不会出现错误*/
/*这里的泛型和本类的类名相同,因为我们比较的是本类里面的部分属性*/
public class VIPCustomers  implements Comparable<VIPCustomers> {
    private  int age;
    private   String  name ;
    @Override
    public int compareTo(VIPCustomers vip) {
        if(this.age ==vip.age){
            /*当年龄一个样的时候,按姓名排*/
            return  this.name.compareTo(vip.name);
        }else{
            /*此时就是年龄排 升序排序 (反过来就是倒序排序)*/
            return this.age-vip.age;
        }
    }
/* 一定要重写toString方法,不重写的话会使用原来的方法,返回对象的地址*/
    @Override
    public String toString() {
        return "VIPCustomers{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

再穿件一个测试类 

public class SortTest   {
    public static void main(String[] args) {
        VIPCustomers v1 = new VIPCustomers(20,"张三");
        VIPCustomers v2 = new VIPCustomers(19,"李四");
        VIPCustomers v3 = new VIPCustomers(40,"赵六");
        VIPCustomers v4 = new VIPCustomers(20,"王五");

        TreeSet<VIPCustomers> t = new TreeSet<>();
        t.add(v1);
        t.add(v2);
        t.add(v3);
        t.add(v4);
        Iterator<VIPCustomers> it = t.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

上述截图就是本次程序运行结果, 

还有一种重要的方式就是使用一个比较器

/*比较器的联系*/
public class ComparatorTest {
    public static void main(String[] args) {
        TreeSet<VIPCustomers>  vip = new TreeSet<>(new Comparator<VIPCustomers>() {
            /*这里采用匿名内部类的方式 TreeSet的构造方法里面应该传入一个比较器的对象*/
            /*这里比较推荐使用一个匿名内部类,当然新创建一个类也可以*/
            @Override
            public int compare(VIPCustomers vipCustomers, VIPCustomers t1) {
                if(vipCustomers.getAge() == t1.getAge()){
                    /*如果年龄一个样的话就按照姓名排序*/
                    return vipCustomers.getName().compareTo(t1.getName());
                }else {
                    return vipCustomers.getAge() - t1.getAge();
                }
            }
        });

        VIPCustomers v1 = new VIPCustomers(20,"张三");
        VIPCustomers v2 = new VIPCustomers(19,"李四");
        VIPCustomers v3 = new VIPCustomers(40,"赵六");
        VIPCustomers v4 = new VIPCustomers(20,"王五");

        vip.add(v1);
        vip.add(v2);
        vip.add(v3);
        vip.add(v4);
        Iterator<VIPCustomers> it = vip.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
    }

最终的结果是一个样的

怎么选择这两种规则?

当比较规则不会发生变化或规则只有一个的时候,采用实现Comparable接口的方法

当比较规则频繁的发生变化或比较规则有多个的时候,采用Comparator接口的方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱布朗熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值