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