TreeSet是属于Set接口中的实现类,对于存入的元素,有着不可重复、无序,但可根据一定排序规则自动排序的特性。TreeSet放入的元素,其实是放入了TreeMap中的key部分(所以底层数据结构是用到了二叉树的,这在排序中也是重要的一种排序法则。创建一个TreeSet对象的时候,实际上是new了一个TreeMap集合,放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了。TreeMap集合底层是二叉树
什么是自定义类型时的排序呢?比如我创建了一个Person类,设定成员数据、构造方法:
那么,这时候,我们通过该类创建多个实例对象,同时创建一个TreeSet实例对象,并放入其中:
运行结果如下:
可以看到关键字"Cannot be cast to class java.lang.Comparable",无法进行比较,问题就出在是否实现了Comparable接口上。
解决办法:
TreeSet要想实现自定义类的排序,必须让相应的类实现Comparable接口,并实现方法,写入自定义的排序规则,例如:
(注意给类重写toString方法)此时再次运行上述测试程序,结果如下:
可以发现,我们通过定义年龄从小到大的排序规则,成功让Animals对象进行了年龄上的升序。至于排序规则怎么怎么实现,具体需要参考到数据结构中二叉树的相关知识了(左子树大于右子树,返回正数往右子树找,返回负数往左子树找,直到this.age-o.age为0即二者相等时就可以返回相应节点了。