数据放进TreeSet,拿出来过后就是有序的。
自定义的类型不能用TreeSet排序。因为自定义的类型没有实现Comparable接口,不能做比较运算。
所以要实现Comparable,实现其中的compareTo方法。在compareTo中要编写比较规则。比如说String类就实现了compareTo方法
使用比较器也可以进行排序,在构造TreeSet的时候传一个比较器对象。
TreeMap的key部分也需要排序。
如果是比较规则比较固定,就实现Comparable接口,不然使用java.util.Comparator接口。然后新建一个类继承该接口并实现其中的compare方法。在新建集合的时候要传入这个比较器对象。
方法一:实现Comparator接口
TreeSet的创建、遍历、添加方法和HashSet类似,但是它按照自己的规则对数据进行排列,比如Integer类型的量按照升序排列。一种改变排列顺序的方法,重写其中的比较器。
TreeSet<Integer> ts=new TreeSet(new Comparator<Integer>() {
public int compare(Integer o1,Integer o2) {
return o2-o1;
}
});
方法二:实现Comparable接口
创建一个Student类implements接口Comparable:
package com.fun;
public class Student implements Comparable {
private String name;
private int grade;
public Student(String name,int grade) throws Exception {
this.name=name;
if (grade>100||grade<0){
throw new Exception("成绩超出范围");
}else{
this.grade=grade;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Override
public int compareTo(Object o) {
if (o instanceof Student) {
return this.grade - ((Student) o).grade;
}else{
return 0;
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", grade=" + grade +
'}';
}
}
实现了该方法的类的对象放进TreeSet集合后,就会自动排序
package com.fun;
import java.util.HashSet;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Student uzi = null;
Student clearlove = null;
Student shy = null;
Student jackielove = null;
// 在try...catch语句里面的变量不能直接在外面调用,需要先写在外面
Student otto = null;
try {
uzi = new Student("uzi", 0);
clearlove = new Student("clearlove", 7);
shy = new Student("shy", 20);
jackielove = new Student("jakielove", 50);
otto = new Student("otto", 99);
} catch (Exception e) {
e.printStackTrace();
}
TreeSet<Student> S = new TreeSet<Student>();
S.add(uzi);
S.add(clearlove);
S.add(shy);
S.add(jackielove);
S.add(otto);
for(Student s:S){
System.out.println(s);
}
}
}
控制台输出: