loading...
TreeSet集合的自然排序和比较器排序
Published in:2022-01-31 | category: Java面试题精选
Words: 1.2k | Reading time: 5min | reading:

自然排序:

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

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

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


Student类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//这个学生类中,如果要进行自然排序(测试类中:通过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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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());
}
}
}
Prev:
谈谈集合框架
Next:
Map和Collection集合的区别?
catalog
catalog