Javase学习记录之------TreeSet比较器排序

TreeSet有2种构造fnagfa
自然排序和比较器排序
TreeSet tt=new TreeSet();
无参构造是自然排序
带参构造是比较强排序

TreeSet
唯一性:是根据比较发返回值是否是0来决定的
排序:
1:自然排序(元素具备比较性)
让元素所属的类实现自然排序接口Comparable
2:比较器排序(集合具备比较性)
让集合的构造方法接收一个比较器接口的子类对象Comparator

public class Student {
    public String name;
    public int age;
    Student(String name,int age){
        this.name=name;
        this.age=age;
    }
}
import java.util.Comparator;

/*
因为构造函数那里需要传这个的对象,所以我们必须先实现它的接口
后面我们使用了匿名内部类,这里我们就不用写了
 */
public class MyComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        //this--s1;s--s2
        //长度
        int num=s1.name.length()-s2.name.length();
        //姓名内容
        int num2=num==0?s1.name.compareTo(s2.name):num;
        //年龄
        int num3=num2==0?s1.age-s2.age:num2;
        return 0;
    }
}
import java.util.Comparator;
import java.util.TreeSet;

public class Demo {
    public static void main(String[] args) {

        //TreeSet<Student> tt=new TreeSet<Student>();自然排序,我们这里不使用

        //TreeSet<Student>tt=new TreeSet<Student>(new MyComparator());
        //如果一个方法的参数是接口,那么真正要的是接口的实现类对象
        //而匿名内部类就可以实现
        //开发中,这种方法是很灵活的,不需要修改学生类,且每次new新对象的使用我们都可以重写方法
        //按照我们想要的方式排序,如果是自然排序,如何我们要修改排序的东西,都要修改学生类很麻烦
        TreeSet<Student>tt=new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //this--s1;s--s2
                //长度
                int num = s1.name.length() - s2.name.length();
                //姓名内容
                int num2 = num == 0 ? s1.name.compareTo(s2.name) : num;
                //年龄
                int num3 = num2 == 0 ? s1.age - s2.age : num2;
                return 0;
            }
        });
        //看看最后这个)的位置,匿名内部类的使用
        //不过这个方法是使用也不多

        Student s1=new Student("lingqingxia",27);
        Student s2=new Student("zhuangguorong",29);
        Student s3=new Student("wanglihong",23);
        Student s4=new Student("lingqingxia",27);
        Student s5=new Student("liushihsi",22);
        Student s6=new Student("wuqilong",40);
        Student s7=new Student("lingqingxia",40);
        tt.add(s1);
        tt.add(s2);
        tt.add(s3);
        tt.add(s4);
        tt.add(s5);
        tt.add(s6);
        tt.add(s7);
        for(Student s:tt){
            //System.out.println(tt.name);
            System.out.println(s.name+"---------"+s.age);
        }

    }
}

程序运行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值