TreeSet集合底层是一个TreeMap
TreeMap集合底层是一个二叉树
放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了
TreeSet集合中的元素:无序不可重复,但是可以按照元素大小顺序自动排序 称为可排序集合
String字符串比较规则: 情况一:对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。 如:“abc"与"aw"比较,第1位a一样,则比较第2位,发现b比w小,则判定"abc"小于"aw”
情况二:对应位置上的字符都一样,比较的就是字符串的长度。 如:“abc"与"abcccc"比较,前3位一样,发现abcccc比abc长,则判定"abc"小于"abcccc”
public class TreeSetTest01 { public static void main(String[] args) { //创建一个TreeSet集合 TreeSet<String> ts = new TreeSet<>(); //添加String元素 ts.add("lisi"); ts.add("zhangsan"); ts.add("wangwu"); //遍历 for (String t : ts){ System.out.println(t); } } } //运行结果: lisi wangwu zhangsan 由运行结果可见,TreeSet集合会对元素进行自动排序不行,会报异常:java.lang.ClassCastException: class collection.Customer cannot be cast to class java.lang.Comparable 因为没有指定自定义类型对象之间的比较规则,无法排序 自定义类需要实现java.lang.Comparable接口
通过实现java.lang.Comparable接口来对自定义类型进行排序:
//实现Comparable接口: //自定义比较规则 public class TreeSetTest03 { public static void main(String[] args) { //创建Customer对象 VIP v1 = new VIP("zhangsan", 15); VIP v2 = new VIP("wangwu", 18); VIP v3 = new VIP("wangyue", 18); VIP v4 = new VIP("lisi", 20); //创建一个TreeSet集合 TreeSet<VIP> ts = new TreeSet<>(); //添加String元素 ts.add(v1); ts.add(v2); ts.add(v3); ts.add(v4); //遍历 for (VIP t : ts){ System.out.println(t); } } } class VIP implements Comparable<VIP> { String name; int age; public VIP(String name, int age) { this.name = name; this.age = age; } public String toString(){ return ("name=" + name + ",age=" + age); } //编写比较规则 //按照年龄排序从小到大 @Override public int compareTo(VIP v) { //年龄相同时,按照姓名排序 if (this.age == v.age){ //姓名是String类型,直接调用String类的compareTo方法进行比较 return this.name.compareTo(v.name); } return this.age - v.age; } } //运行结果: name=zhangsan,age=15 name=wangwu,age=18 name=wangyue,age=18 name=lisi,age=20