一、TreeSet介绍
TreeSet的数据结构可以理解为是二叉树数据结构,我们可以使用TreeSet实现排序功能,TreeSet通过定义一个比较容器Comparator来完成集合对象中的排序。
二、TreeSet代码示例
public class Student{
//属性
private String name;
private int age;
//写操作
public void setName(String name){
this.name=name;
}
//读操作
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
再定义一个类,在这个类中我们定义了一个TreeSet类的对象。尝试往里面添加几个学生对象。
public class TreeStu{
public static void main(String []args){
Student student1=new Student();
student1.setName("张三1");
student1.setAge(12);
Student student2=new Student();
student2.setName("张三2");
student2.setAge(13);
Student student3=new Student();
student3.setName("张三3");
student3.setAge(10);
Student student4=new Student();
student4.setName("张三4");
student4.setAge(80);
TreeSet set=new TreeSet();
set.add(student1);
set.add(student2);
set.add(student3);
set.add(student4);
}
}
运行程序,抛出了异常:
虽然上面的代码非常简单,没有任何逻辑,仅仅只是添加了几个数据,但是程序还是出错了,这是因为TreeSet在添加数据的时候,就必须要求数据按照一定的顺序进行组织,这也是二叉树的一个特点。所以我们需要给TreeSet设置一个比较器。
先新建一个类MyTreeComparator实现接口Comparator:
public class MyTreeComparator implements Comparator{
//比较的方法
@Override
public int compare(Object o1,Object o2){
Student student1=(Student)o1;
Student student2=(Student)o2;
if(student1.getAge()>student2.getAge()){
return -1;
}else if(student1.getAge()<student2.getAge()){
return 1;
}
return 0;
}
}
在java.util.Comparator接口的定义中,最重要的是compare(T o1,T o2)方法,该方法一般返回值为负数、0和正数,一般选用-1,0,1
-1:表示o1权重小于o2
0:表示o1权重等于o2
1:表示o1权重大于o2
Comparator的compare()方法交给被传入的TreeSet自行调用,不需要开发时程序员去调用.
然后 修改上面的TreeStu类,在构造TreeSet时设置比较器,然后添加数据.
public class TreeStu{
public static void main(String []args){
Student student1=new Student();
student1.setName("张三1");
student1.setAge(12);
Student student2=new Student();
student2.setName("张三2");
student2.setAge(13);
Student student3=new Student();
student3.setName("张三3");
student3.setAge(10);
Student student4=new Student();
student4.setName("张三4");
student4.setAge(80);
//把比较器传给TreeSet
MyTreeComparator comparator=new MyTreeComparator();
Tree set=new TreeSet(comparator);
set.add(student1);
set.add(student2);
set.add(student3);
set.add(student4);
System.out.println(set.size());
Iterator iterator=set.iterator();
while(iterator.hashNext()){
Student stu=(Student)iterator;
System.out.println(stu.getName()+":"+stu.getAge());
}
}
}
打印出所有的学生信息,学生将会按照年龄进行排序。