TreeSet类
TreeSet元素唯一,且可以对元素进行排序
底层数据结构是二叉树
排序,自然排序和比较器排序
我们先来看下输入一堆乱七八糟的数后直接打印输出后的结果
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(21);
treeSet.add(1230);
treeSet.add(0);
treeSet.add(10);
treeSet.add(45);
System.out.println(treeSet);
他的结果是[0, 10, 21, 45, 1230]//由此可见他输进去的元素是唯一的,而且可以对元素进行排序
如果我们存进去的是一个对象的话怎么排序呢,如果直接遍历或者打印输出又是什么结果呢,我们来看一下
这个输出的时候会出现
Exception in thread “main” java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
这个意思就是他无法排序,因为你里面了写的是一个对象,对象用Comparable无法比较,所以这个时候我们就要通过重写的方式来进行比较
那么怎么重写呢?
我们有两种重写的方法,一种是自然排序下的重写,一种是用比较器来排序,接下来我给大家演示下怎么进行重写
首先我们要直到Comparable返回的是数字,如果要正向排序,就要返回1,如果要反向排序,就要返回-1,如果有重复的返回0,则删除一个重复项
就拿我上面写的为例,拥有Student类
自然排序
自然排序就是在t无参构造的前提下进行的排序
也就是要在Student类里面来进行对方法Comparable进行重写
重写方法如下
比较器排序就是对new TreeSet的时候,在参数上加入比较器,来进行对Comparator的重写,重写方法如下
用比较器来排序就不需要对自定义的类进行加接口的操作了,也不用在自定义类里对Comparable进行重写了。这里num2如果返回的是正1,则对他正向排序,如果是-1,对他进行反向排序