引言
大家都应该了解许多存储数据的容器了,对于我们程序猿来说,每天都要和它们打交道,今天要给大家介绍的TreeSet便是一种集合容器,它是Set接口的实现类。希望大家看了这篇文章后能有所收获。
存储数据的特点
- 不能添加重复元素,添加顺序和打印顺序不一致,但在容器内部是有特定的规则进行排序的。
- TreeSet容器对象:添加一种类型之后不能再添加其他类型(HashSet是不是也是这样呢?)
重复判断之自然排序
对于我们存储的数据,默认判断依据便是这种自然排序。自然排序是接口Comparable强行对它的每个实现类进行整体排序,在此我通过自定义类实现接口并覆写其中的compareTo方法讲述其实现原理。
- 我们的类必须是Comparable接口的实现类并提供字段和构造方法。如果不是的话运行会报异常,小伙伴们可以试一下(我们的常用类Integer,String等都是Comparable接口的实现类)。
class Animals implements Comparable {
- 每次添加数据的时候都会调用我们覆写的compareTo方法,会根据返回值类型来判断我们所添加的数据是否重复。
- 返回值为0判断重复,不添加数据
- 返回值为1或-1,判断不重复,添加数据
@Override
public int compareTo(Object o) {
if( this==o ){//如果地址相同,当然是同一对象
return 0;
}
} if( getClass() != o.getClass() ){//如果运行时类型不一致,肯定不是同一对象
return -1;
}
Animals ani = (Animals) o;//需要将o强转成Animals才能访问字段属性。运用泛型的话此处可省略
if(this.age > ani.age){
return 1;
}else if(this.age < ani.age){
return -1;
}else {
return this.name.compareTo(ani.name);//String类中已经覆写了conpareTo方法,直接调用即可
}
}
重复判断之定制排序
当我们遇到只需要判断所添加对象的某个属性是否重复时,再使用默认的自然排序就会变得比较复杂,此时我们就需要用到定制排序。它有两种方式实现。
自定义类实现
- 首先需要自定义一个Comparator接口的实现类来定义我们的判断标准。
注意:TreeSet只能添加同类型的数据,所以自定义的类和我们所添加数据对应的类是对应的。
public class TeacherCompartor implements Comparator {
- 覆写抽象方法compare,这也是我们的判断标准(和我们所添加数据对应的类相关)
@Override
public int compare(Object o1, Object o2) {
Teacher t1 = (Teacher)o1;
Teacher t2 = (Teacher)o2;
return t1.name.compareTo(t2.name);
}
- 构建我们的定制排序的集合容器
TeacherCompartor teacher = new TeacherCompartor();
TreeSet ts = new TreeSet(teacher);
这样我们的定制排序集合容器便完成了。
匿名内部类实现(推荐)
话不多说,上代码
//new Tree中需要我们传入Comparator类型数据,但是Comparator是个接口,所以我们可以试用匿名内部类实现(数据兼容)
TreeSet treeSet = new TreeSet(new Comparator() {//这是一个内部类
@Override
public int compare(Object o1, Object o2) {//覆写compare方法对象进行比较
Student stu1 = (Student) o1;
Student stu2 = (Student) o2;
Integer age1 = new Integer(stu1.age);
Integer age2 = new Integer(stu2.age);
return age1.compareTo(age2);//转换成Integer之后,因为Integer是Comparable的实现类,直接调用compareTo方法
}
});
我们的定制排序集合容器定义完毕,这是我初学java的第一个博客,小伙伴有什么不懂的或者我某些地方说错了的欢迎留下评论。