TreeSet集合的自然排序和比较器排序

自然排序:

执行无参构造方法:TreeSet< T >():无参构造

要求当前自定义类型需要实现Comparable接口,重写comparesTo方法

它的主要实现方式如以下代码所示:


Student类:

//这个学生类中,如果要进行自然排序(测试类中:通过TreeSet()创建对象),这个类必须实现接口:Comparable
public class Student implements Comparable<Student>{

//提供两个属性
   private String name;
   private int age;
   public Student() {
     super();
    }
//有参构造
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    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;
	}
	
	/**
	 * 重写Comparable接口中的comparaTo方法
	 * @param s1
	 * @return
	 */
	public int compareTo(Student s){//s:后面需要进来的学生对象
		//提供一个条件:主要条件:按照学生的年龄从小到大排序
		//年龄: int类型
		int num = this.age - s.age ;
		
		//如果年龄相同的话:姓名不一定一样! 姓名:String
		//如果年龄相同,按照姓名的字典顺序比较,如果不相同
		int num2 = (num == 0)? (this.name.compareTo(s.getName())) : num;
		return num2;
	}

	
}

TestSetDemo:

import java.util.TreeSet;
/*
 * 使用TreeSet集合存储学生类型
 * 
 * TreeSet<Student> :跟排序相关,提供一个条件:主要条件:按照学生的年龄从小到大排序
 * 学生有两个属性:
 * 		姓名(英文的字符)和年龄
 */
public class TreeSetDemo02 {
	public static void main(String[] args) {
		
		//创建TreeSet集合
		TreeSet<Student> ts = new TreeSet<Student>();
		
		//创建Student对象
		Student s1 = new Student("gaoyuanyuan",37);
		Student s2 = new Student("gaoyuanyuan",37);
		Student s3 = new Student("dengchao",35);
		Student s4 = new Student("wuqilong",35);
		Student s5 = new Student("wuyifan",21);
		Student s6 = new Student("liudehua",47);
		Student s7 = new Student("chenglong",52);
		
		//将Student对象添加到TreeSet集合中
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		
		
		//遍历集合,将学生的信息打印在控制台上
		for (Student student : ts) {
			System.out.println(student.getName()+"-------"+student.getAge());
		}
	}
}

比较器排序:

执行有参构造方法:TreeSet< Student >(Comparator< Student > com):

  • 方式1:自定义一个类实现Comparator接口中 的compare(T t1,T t2)方法
  • 方式2:通过接口匿名内部类实现

具体举例如以下代码所示(学生类均如自然排序中的学生类所示):


方式1:

TreeSetDemo类:

public class TreeSetDemo {
	public static void main(String[] args) {
		
		//创建TreeSet集合
		//方式1:直接给了创建了接口子实现类
		Set<Student> set = new TreeSet<Student>(new MyComparator<Student>());
		//形式参数是一个接口类型,需要传递该接口实现类对象
        
        //创建学生类对象
		Student s1 = new Student("zhangsan" , 41);
		Student s2 = new Student("zhangsan" , 41);
		Student s3 = new Student("lisi" , 35);
		Student s4 = new Student("wangwu" , 35);
		Student s5 = new Student("zhangsan" ,28);
		Student s6 = new Student("laoliu" ,20);
		Student s7 = new Student("dage" ,52);
		
		//将对象添加到TreeSet集合中
		set.add(s1);
		set.add(s2);
		set.add(s3);
		set.add(s4);
		set.add(s5);
		set.add(s6);
		set.add(s7);
		
		//遍历集合
		for (Student student : set) {
			System.out.println(student.getName() + "--------" + student.getAge());
		}
	}
}

Comparator接口的具体实现类(MyComparator类)

package com.yk.treeset_02;

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {

    @Override
    public int compare(Student s1, Student s2) {
        //主要条件:学生年龄按从大到小排序
        //s1 ---> this
        //s2 ---> s
        int num = s2.getAge() - s1.getAge();

        //学生年龄相同,比较姓名是否一样
        int num2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;
        return num2;
    }

}

方式2:

具体实现类(TreeSetDemo):

public class TreeSetDemo {
	public static void main(String[] args) {
		//方式2: 形参参数接口:传入接口的匿名内部类(本质:接口的子实现类)
		//匿名内部类(推荐的方式)
		/*
		 * 匿名内部类的格式:
		 * 		new 类名/接口名(){
		 * 			重写抽象类中或者接口中的抽象方法。。。
		 * 		};
		 */
		Set<Student> set = new TreeSet<Student>(new Comparator<Student>(){	//创建匿名内部类实现Comparator接口
			
			
			@Override
			public int compare(Student s1, Student s2) {
				//主要条件:学生年龄从大到小排序
				int num = s2.getAge() - s1.getAge();
				
				//学生年龄相同,比较姓名是否一样
				int num2 = (num == 0)? (s1.getName().compareTo(s2.getName())) : num ; 
				return num2;
			}
			});
		
		//创建学生类对象
		Student s1 = new Student("zhangsan" , 41);
		Student s2 = new Student("zhangsan" , 41);
		Student s3 = new Student("lisi" , 35);
		Student s4 = new Student("wangwu" , 35);
		Student s5 = new Student("zhangsan" ,28);
		Student s6 = new Student("laoliu" ,20);
		Student s7 = new Student("dage" ,52);
		
		//将对象添加到TreeSet集合中
		set.add(s1);
		set.add(s2);
		set.add(s3);
		set.add(s4);
		set.add(s5);
		set.add(s6);
		set.add(s7);
		
		//遍历集合
		for (Student student : set) {
			System.out.println(student.getName() + "--------" + student.getAge());
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值