set集合的唯一性(二)——TreeSet

来源:互联网 发布:无锡大数据会议 编辑:程序博客网 时间:2024/06/06 03:55


TreeSet
    它既然属于set,那么它也遵循无序、唯一,但TreeSet说无序是指它的存入顺序和取出顺序不一致,而它取出的顺序也是有序的,是按照自然循序(即字典顺序)取出的。
    保证TreeSet唯一性共有两种方法:

               方法一:通过自定义类实现comparable接口并重写compareTo()来保证唯一性;

例:

package collection;import java.util.TreeSet;//TreeSet元素是自定义类,如何保证元素的唯一性//方式一:利用自定义类实现comparable接口并重写compareTo()来保证唯一性public class TreeSetDemo2 {public static void main(String[] args) {// 创建TreeSet集合TreeSet<Human> ts = new TreeSet<Human>();// 创建Human对象Human s1 = new Human("zhangsan", 21);Human s2 = new Human("lisi", 22);Human s3 = new Human("wangwu", 23);Human s4 = new Human("zhaoliu", 24);Human s5 = new Human("lisi", 22);Human s6 = new Human("qiaoqi", 25);Human s7 = new Human("zhangsan", 21);Human s8 = new Human("zhangsan", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历元素for (Human str : ts) {System.out.println(str.getName() + "---" + str.getAge());}}}class Human implements Comparable<Human> {private String name;private int age;public Human(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Human h) {//重写compareTo(),并按照名字的自然顺序其次年龄从小到大排序int result = this.getName().compareTo(h.getName());result = (result == 0) ? (this.getAge() - h.getAge()) : result;return result;}}


               方法二:利用TreeSet带参构造,保证元素的唯一性。
例:

package collection;import java.util.Comparator;import java.util.TreeSet;//TreeSet元素是自定义类,如何保证元素的唯一性//方式二:利用TreeSet带参构造,保证元素的唯一性public class TreeSetDemo3 {public static void main(String[] args) {// 创建TreeSet集合TreeSet<Teacher> ts = new TreeSet<Teacher>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher o1, Teacher o2) {//重写compare(),并按照名字的自然顺序其次年龄从小到大排序int result = o1.getName().compareTo(o2.getName());result = (result == 0) ? (o1.getAge() - o2.getAge()) : result;return result;}});// 创建Teacher对象Teacher t1 = new Teacher("zhangsan", 21);Teacher t2 = new Teacher("lisi", 22);Teacher t3 = new Teacher("wangwu", 23);Teacher t4 = new Teacher("zhaoliu", 24);Teacher t5 = new Teacher("lisi", 22);Teacher t6 = new Teacher("qiaoqi", 25);Teacher t7 = new Teacher("zhangsan", 21);Teacher s8 = new Teacher("zhangsan", 29);// 添加元素ts.add(t1);ts.add(t2);ts.add(t3);ts.add(t4);ts.add(t5);ts.add(t6);ts.add(t7);ts.add(s8);// 遍历元素for (Teacher str : ts) {System.out.println(str.getName() + "---" + str.getAge());}}}class Teacher {private String name;private int age;public Teacher(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}


总结:TreeSet是基于TreeMap,而TreeMap又是基于二叉树,所以,在通过comparable的compareTo()或者comparator的compare()后,元素会通过返回的int值分为三种情况

                                                                                                          |--正数,存放在被比较元素的右边
                                                                                                          |-- 0  ,替换被比较元素
                                                                                                          |--负数,存放在被比较元素的左边
它不仅保证了元素的唯一性,而且根据自定义的比较器,迭代出的顺序也是可以自定义的。




0 0