TreeSet:
public class TreeSet
extends AbstractSet
implements NavigableSet, Cloneable, SerializableA NavigableSet实现基于TreeMap的元件(元素)使用其有序natural ordering,或由Comparator集合创建时提供,这取决于所使用的构造方法。
TreeSet集合的特点:
- 1.元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的顺序进行排序,具体排序方式取决于构造方法
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
- 2.没有带索引的方法,不能使用普通for循环进行遍历
- 3.由于是Set集合,所以不包含重复元素的集合
import java.util.TreeSet;
public class TreeSetDemo01 {
public static void main(String[] args) {
//创建集合对象
// 集合只能存储引用类型,存储整数应该用Integer包装类型,而不用int基本类型。
TreeSet<Integer> ts = new TreeSet<Integer>();
//添加元素
ts.add(10);//自动装箱,直接给int型10也是可以的
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20);
ts.add(30);
for (Integer i:ts){
System.out.println(i);
}
}
}
运行结果:
D:\Users\Java\jdk1.8.0_102\bin\java.exe …
10
20
30
40
50
自然排序Comparator的使用:
- 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
- 要求:按照年龄从小到大排序,年龄相同时按照姓名的字母顺序进行排序
结论:
- 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
- 自然排序就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
- 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
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;
}
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; //如果返回的是0,认为是重复元素,不会添加第一个之后的元素
// return 1; //如果返回的是1,认为是正数,会按照升序存储
// return -1; //如果返回的是-1,认为是负数,会按照降序存储
int num = this.age - s.age; //this.age可以认为是s2,s.age可以认为是s1
//如果逆序用:int num = s.age - this.age;
//如果年龄相同,则按照字母顺序进行排序
int num2 = num==0?this.name.compareTo(s.name):num;
return num2;
}
}
import java.util.TreeSet;
/*
实现存储学生对象并遍历,创建集合使用无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序进行排序
*/
public class TreeSetDemo02 {
public static void main(String[] args) {
//创建集合对象
TreeSet<Student> ts = new TreeSet<Student>();
//创建学生对象
Student s1 = new Student("xishi", 23);
Student s2 = new Student("wangzhaojun", 22);
Student s3 = new Student("diaochan", 24);
Student s4 = new Student("xiaoqiao", 20);
Student s5 = new Student("daqiao", 22);
//把学生添加到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍历集合
//要实现自然排序,Srudent类中必须重写实现类方法Comparable,否则运行报错
for (Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}
运行结果:
D:\Users\Java\jdk1.8.0_102\bin\java.exe …
xiaoqiao,20
daqiao,22
wangzhaojun,22
xishi,23
diaochan,24
比较器排序Comparator的使用:
- 存储学生对象并遍历,创建TreeSet集合使用带参构造方法
- 要求:按照年龄从小到大排序,年龄相同时按照姓名的字母顺序进行排序
结论:
- 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序
- 比较器排序,就是让集合构造方法接受Comparator的实现类对象,重写compare(To1,To2)方法
- 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name, int age){
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;
}
}
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo03 {
public static void main(String[] args) {
//创建集合对象
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// return 0;
//this.age - s.age
//s1 - s2
int num = s1.getAge() - s2.getAge();
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});//匿名内部类的方式
//创建学生对象
Student s1 = new Student("xishi", 23);
Student s2 = new Student("wangzhaojun", 22);
Student s3 = new Student("diaochan", 24);
Student s4 = new Student("xiaoqiao", 20);
Student s5 = new Student("daqiao", 22);
//把学生添加到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍历集合
//要实现自然排序,Srudent类中必须重写实现类方法Comparable,否则运行报错
for (Student s : ts) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}
运行结果:
D:\Users\Java\jdk1.8.0_102\bin\java.exe …
xiaoqiao,20
daqiao,22
wangzhaojun,22
xishi,23
diaochan,24