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; } @Override public 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>() { @Override public 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 ,替换被比较元素
|--负数,存放在被比较元素的左边
它不仅保证了元素的唯一性,而且根据自定义的比较器,迭代出的顺序也是可以自定义的。