【Java】TreeSet【自然排序实现Comparable接口、定制排序匿名内部类 new Comparator】 的使用

自然排序 Comparable 的使用
    存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
比较器排序Comparator的使用
    存储学生对象并遍历,创建TreeSet集合使用带参构造方法
    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

自然排序 Comparable 的使用

1.定义一个学生类

package Comparable;

/*
3.8自然排序Comparable的使用
    存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

 */
public class student  implements Comparable<student>{
    //成员方法
    private String name;
    private int age;

    //构造方法
    public student() {
    }


    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //get/set方法
    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;
    }


    //直接输入compareTo 自动生成
    @Override
    public int compareTo(student s) {
       //* return 0;//认为是重复元素不添
        //return 1;//1的话会认为不重复(按照 升序 存储顺序)
       // return -1; //不重复(按照 降序 存储顺序)*//*

        // 主要条件:按照年龄从小到大
        int num = this.age - s.age;//升序   this就是s2 s就是s1
//        int num = s.age - this.age; //降序
        //次要条件:年龄相同时,按照姓名的字母顺序排序
        //这里可以姓名相同年龄不同
        //int num = this.name - s.name;
        //int num2 = num == 0 ? this.age.compareTo(s.age) : num;

        int num2 = num == 0 ? this.name.compareTo(s.name) : num;
        //当num==0时this.name跟s.name进行比较(采用字母顺序进行排序)
        //如果num不等于0 返回num(: num)
        return num2;
    }
}

2.定义一个TreeSet测试类

package Comparable;

import java.util.Iterator;
import java.util.TreeSet;

/*
自然排序 Comparable 的使用
    存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
    用TreeSet集合存储自定义对象,无参构造方法使用的是 自然排序 对元素进行排序的
    自然排序,就是让元素所属的类 实现Comparable接口,重写 compareTo(To)方法
    重写方法时,一定要注意排序规则必须按照要求的 主要条件 和 次要条件 来写

 */
public class Comparabledemo {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<student> tree = new TreeSet<student>();//无参构造方法

        //创建学生对象
        student s1 = new student("wuer",27);
        student s2 = new student("weuers",250);
        student s3 = new student("wcdds",215);
        student s4 = new student("sdew",295);

        student s5 = new student("swdds",295);
        student s6 = new student("wcdds",215);//保证唯一性
        //添加元素
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);

        tree.add(s5);//return为0 认为是重复的
        tree.add(s6);
        //采用迭代器进行遍历
        Iterator<student> it = tree.iterator();
        while(it.hasNext()){
            student s = it.next();
            System.out.println(s.getName()+",\t"+s.getAge());
            //ClassCastException 类转换异常
            //在student类中 实现Comparable
            //重写Comparable方法
        }
        System.out.println("---------");
        //采用for循环进行遍历
        for (student s : tree) {
            System.out.println(s.getName()+",\t"+s.getAge());

        }
    }
}

 排序Comparator的使用

1创建一个学生类

package Comparator;
 
/*
比较器排序Comparator的使用
    存储学生对象并遍历,创建TreeSet集合使用带参构造方法
    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
    用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
    比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
 */
public class student  {//去掉 implements Comparable<student>
    //成员方法
    private String name;
    private int age;
 
    //构造方法
    public student() {
    }
 
 
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    //get/set方法
    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 s) {
       *//* return 0;//认为是重复元素不添
        return 1;//1的话会认为不重复(按照 升序 存储顺序)
        return -1; //不重复(按照 降序 存储顺序)*//*
        // 主要条件:按照年龄从小到大
        int num = this.age - s.age;//升序   this就是s2 s就是s1
//        int num = s.age - this.age; //降序
        //次要条件:年龄相同时,按照姓名的字母顺序排序
        int num2 = num == 0 ? this.name.compareTo(s.name) : num;
        //当num==0时this.name跟s.name进行比较(采用字母顺序进行排序)
        //如果num不等于0 返回num(: num)
        return num2;
    }*/
}

 2.定义一个TreeSet测试类

package Comparator;
 
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
 
/*
比较器排序Comparator的使用
    存储学生对象并遍历,创建TreeSet集合使用带参构造方法
    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
    用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
    比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
 */
public class Comparabledemo {
    public static void main(String[] args) {
        //创建集合对象
        // TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。
		TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
			//采用匿名内部类的方式 因为不知到接口的实现类名字所以用 接口名 进行代替
			//实现Comparator接口对compare方法进行重写
			@Override
			public int compare(Student s1, Student s2) {
				// TODO Auto-generated method stub
				//这里s1不能访问学生类的私有成员因为封装了,只能通过get方法获取
                //this.age - s.age   //s1指的是this,s2指的是s
                //按照年龄从小到大排序
                int num = s1.getAge() - s2.getAge();//这里是调用方法
                //年龄相同时,按照姓名的字母顺序排序
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
 
                return num2;
            }
        });//带参构造方法
 
        //创建学生对象
        student s1 = new student("wuer", 27);
        student s2 = new student("weuers", 250);
        student s3 = new student("wcdds", 215);
        student s4 = new student("sdew", 295);
 
        student s5 = new student("swdds", 295);
        student s6 = new student("wcdds", 215);//保证唯一性
        //添加元素
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);
 
        tree.add(s5);//return为0 认为是重复的
        tree.add(s6);
        //采用迭代器进行遍历
        Iterator<student> it = tree.iterator();
        while (it.hasNext()) {
            student s = it.next();
            System.out.println(s.getName() + ",\t" + s.getAge());
            //ClassCastException 类转换异常
            //在student类中 实现Comparable
            //重写Comparable方法
        }
        System.out.println("---------");
        //采用for循环进行遍历
        for (student s : tree) {
            System.out.println(s.getName() + ",\t" + s.getAge());
 
        }
    }
}

结论
    用TreeSet集合存储自定义对象,无参构造方法使用的是 自然排序 对元素进行排序的
    自然排序,就是让元素所属的类 实现Comparable接口,重写 compareTo(To)方法
    重写方法时,一定要注意排序规则必须按照要求的 主要条件 和 次要条件 来写

    用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
    比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mxin5

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

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

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

打赏作者

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

抵扣说明:

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

余额充值