欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-09 22:35:08
...

自然排序:

执行无参构造方法: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("*fan",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());
		}
	}
}