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());
}
}
}
上一篇: TreeSet-自然排序与比较器排序