TreeSet 的俩种比较排序方式实现

本文详细解析了Java中TreeSet集合的使用,包括如何通过实现Comparable接口进行自然排序,以及如何使用Comparator接口进行自定义排序。通过具体示例展示了不同排序方式的应用场景。

特点:元素唯一,且可对元素进行排序;自然排序比较器排序

     使用TreeSet集合进行元素的自然排序,那么对元素有要求,要求这个元素必须实现Comparable接口,否则无法进行自然排序。

自然排序:

/**
 * 自然排序
 */
public class Dog implements Comparable<Dog>{
    private String name;
    private Integer age;
    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public int compareTo(Dog dog) {
        // 首先比较name长度
        int num1 = this.name.length() - dog.name.length();
        // 其次比较name的字典顺序,String类的compareTo()方法
        int num2 = num1 == 0 ? this.name.compareTo(dog.name) : num1;
        // 最后比较年龄大小
        int num3 = num2 == 0 ? this.age - dog.age : num2;
        return num3;
    }
}
/**
 * 自然排序
 */
@Test
public void test1(){
    TreeSet<Dog> dogSet = new TreeSet<>();
    dogSet.add(new Dog("dahuang",2));
    dogSet.add(new Dog("alfa",1));
    dogSet.add(new Dog("langgou",3));
    System.out.println(dogSet);
}
输出结果:
[Dog{name='alfa', age=1}, Dog{name='dahuang', age=2}, Dog{name='langgou', age=3}]

比较器排序:

public class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
/**
 * 比较器排序
 */
@Test
public void test2(){
    TreeSet<Person> personTreeSet = new TreeSet<>(new Comparator<Person>() {
        @Override
        public int compare(Person o1, Person o2) {
            // 首先比较name长度
            int num1 = o1.getName().length() - o2.getName().length();
            // 其次比较name的字典顺序,String类的compareTo()方法
            int num2 = num1 == 0 ? o1.getName().compareTo(o2.getName()) : num1;
            // 最后比较年龄大小
            int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2;
            return num3;
        }
    });
    personTreeSet.add(new Person("lili",12));
    personTreeSet.add(new Person("ali",10));
    personTreeSet.add(new Person("ali",9));
    personTreeSet.add(new Person("bli",13));
    System.out.println(personTreeSet);
}
输出结果:
[Person{name='ali', age=9}, Person{name='ali', age=10}, Person{name='bli', age=13}, Person{name='lili', age=12}]

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值