JAVA集合,TreeSet排序

  • 说明
    Java提供了两种TreeSet的排序规则,分别为自然排序和自定义排序。在默认情况下,TreeSet集合都是采用自然排序。
  • 自然排序
    自然排序要求向TreeSet集合中存储的元素所在类必须实现Comparable接口,并重写compareTo()方法,然后TreeSet集合就会对该类型元素使用compareTo()方法进行比较。compareTo()方法将当前对象(this)与指定的对象进行顺序比较,返回值为一个整数,其中返回负整数、零或正整数分别表示当前对象小于、等于或大于指定对象,默认根据比较结果顺序排列。
  • 自定义排序
    如果不想实现Comparable接口或者不想按照实现了Comparable接口的类中compareTo()方法的规则进行排序,可以通过自定义比较器的方式对TreeSet集合中的元素自定义排序规则。实现Comparator接口的类都是一个自定义比较器,可以在自定义比较器中的compare()方法中自定义排序规则。
    比喻下面的测试案例,在TreeSet集合中自定义排序,排序规则是先根据Student的age降序排列,如果age相同则根据name进行降序排列
    步骤一:创建Student类。
    步骤二:定义main()方法 ,创建一个TreeSet集合并通过匿名内部类的方式实现了Comparator接口,在内部类中重写了Comparator接口的compare()方法。
  • 测试类
import entity.Student;
import java.util.TreeSet;

/**
 * TreeSet 测试
 * @author : ZhouMei
 * @date Date : 2022年08月11日 10:31
 * @Description: TODO
 */
public class TreeSetTest {

    public static void main(String[] args) {
        //使用默认比较器
        TreeSet set = new TreeSet();

        /*
        //自定义比较器
        TreeSet set = new TreeSet(new Comparator<Student>() {
            public int compare(Student s1, Student s2) {
                int num = s2.getAge() - s1.getAge();
                return num!=0? num : s2.getName().compareTo(s1.getName());
            }
        });
        */

        set.add(new Student(1, "Lucy", 18));
        set.add(new Student(2, "Tom", 22));
        set.add(new Student(3, "Bob", 22));
        set.add(new Student(4, "Tom", 22));

        System.out.println(set);
    }

}

  • Student类
package entity;
import lombok.Data;

/**
 * @author : ZhouMei
 * @date Date : 2022年08月11日 10:20
 * @Description: TODO
 */
@Data
public class Student implements Comparable {
    private Integer id;
    private String name;
    private Integer age;

    public int compareTo(Object o1) {
        Student s1 = (Student) o1;

        if(this.age > s1.age){
            return 1;
        }

        if(this.age == s1.age){
            return this.name.compareTo(s1.name);
        }

        return -1;
    }

    public Student(Integer id, String name, Integer age){
        this.id = id;
        this.name = name;
        this.age = age;
    }

}

  • 测试结果
[Student(id=1, name=Lucy, age=18), Student(id=3, name=Bob, age=22), Student(id=2, name=Tom, age=22)]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值