当前位置: 代码迷 >> 综合 >> JavaSE基础(105) TreeSet
  详细解决方案

JavaSE基础(105) TreeSet

热度:96   发布时间:2023-12-13 15:11:25.0

 

TreeSet的介绍及基本使用
    1.基于 TreeMap 的 NavigableSet 实现
    2.使用元素的自然顺序对元素进行排序
    3.或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法
    4.注意,此实现不是同步的SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
TreeSet基本使用
    1.特点:不重复
    2.添加顺序与迭代顺序不一致(其实内部是有序的)
    3.Integer是Java已经写好的一个类,10Integer对象【元素】Integer 具有自然排序的能力
    4.String是Java已经写好的一个类,String "A" 对象【元素】String 具有自然排序的能力
    5.TreeSet集合是可以添加任意数据类型的
    6.一个TreeSet集合,添加一种元素之后,不能在添加其他类型了

定制比较器 和 compareTo 同时存在 优先使用哪个?? ==》定制比较器


ex1:测试 ==》一个TreeSet集合,添加一种元素之后,不能在添加其他类型了


ex2:测试 ==》compareTo:返回 负整数:-1  、零:0 或 正整数:1    根据此对象是小于、等于还是大于指定对象

       (这个例子中返回的是0==》即stu1和stu2相等)

/*** 测试 TreeSet添加自定义元素*   1.自定义类,不能添加到TreeSet,不能转换成Comparable*   2.Comparable此接口强行对实现它的每个类的对象进行整体排序* 自己定义的类实现了,Comparable接口,该类的对象,就具有了自然排序的能力*   3.Comparable 接口中有比较对象的方法  * 比较此对象与指定对象的顺序。此对象谁调用该方法,指定对象,传入的 对象 * compareTo:返回 负整数:-1  、零:0 或 正整数:1    根据此对象是小于、等于还是大于指定对象* @author 郑清*/
public class Demo {public static void main(String[] args) {TreeSet treeSet = new TreeSet();Student stu1 = new Student("张三", 18);Student stu2 = new Student("张三2", 18);treeSet.add(stu1);treeSet.add(stu2);System.out.println(treeSet.size());System.out.println(treeSet);}
}
class Student implements Comparable{String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Object o) { //返回 负整数:-1  、零:0 或 正整数:1    根据此对象是小于、等于还是大于指定对象// TODO Auto-generated method stubreturn 0;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn name+"-->"+age;}
}

运行结果图:


ex3:覆写自然排序中的ComparTo方法 ==> 实现Student元素之间的比较

/*** 1.覆写自然排序中的ComparTo方法 ==> 实现Student元素之间的比较* 2.比较Student元素 ==> 参考该类的字段* 3.Integer String :直接放入到了TreeSet: 已经具备了自然排序的能力* @author 郑清*/
public class Demo {public static void main(String[] args) {TreeSet treeSet = new TreeSet();Student stu1 = new Student("张三", 18);Student stu2 = new Student("张三2", 18);treeSet.add(stu1);treeSet.add(stu2);System.out.println(treeSet.size());System.out.println(treeSet);}
}
class Student implements Comparable{String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Object o) {Student stu = (Student)o;if(this.age>stu.age){return 1;}else if(this.age<stu.age){return -1;}else{return this.name.compareTo(stu.name);}}@Overridepublic String toString() {return name+"-->"+age;}
}

运行结果图:


ex4:定制比较器  compareTo 同时存在 优先使用 ==》定制比较器

/*** 1.实际 业务开发中,别人写的Student有了自然排序的规则,但是不符合自己使用的需求* 2.需要自定义规则 ==》定制比较器* 3.自定义类实现 Comparator接口  ==》覆写compare方法* 4.细节:*   ①自定义类是没有排序能力*   ②给容器指定了定制比较器(裁判)*   ③只要 容器有了裁判,可以对指定的类型,进行排序比较*   ④如果一个容器指定了定制比较器  ==》该容器 只能比较 比较器指定的类型*   ⑤如果一个Student类型,有自然排序的能力,存放的TreeSet已经有了定制比较器(比较的Student)* 定制比较器 和 compareTo 同时存在 优先使用哪个?? ==》定制比较器* @author 郑清*/
public class Demo {public static void main(String[] args) {StudentComparator studentComparator = new StudentComparator();TreeSet treeSet = new TreeSet(studentComparator);Student stu1 = new Student("张三", 18);Student stu2 = new Student("张三2", 18);treeSet.add(stu1);treeSet.add(stu2);System.out.println(treeSet.size());System.out.println(treeSet);}
}
class Student implements Comparable{String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name+"-->"+age;}@Overridepublic int compareTo(Object o) {Student stu = (Student)o;if(this.age>stu.age){return 1;}else if(this.age<stu.age){return -1;}else{return this.name.compareTo(stu.name);}}
}
class StudentComparator implements Comparator {@Overridepublic int compare(Object o1, Object o2) {Student stu1 = (Student)o1;Student stu2 = (Student)o2;if(stu1.age>stu2.age){return  1;}else if(stu1.age<stu2.age){return -1;}else{return stu1.name.compareTo(stu2.name);}}
}

运行结果图: