TreeSet
TreeSet底层使用红黑树进行存储,可以按照插入对象的属性进行排序
要求,插入的对象,必须要是相同的类,否则会报错
报错的原因:
**因为在Set本身是用于存储无序的,不重复的元素,在HashSet和LinkedHashSet中使用equals()+hashCode()的方式进行判断,而对于TreeSet,因为其可以实现对插入对象的属性进行比较,所以插入的对象必须实现Comparable接口(自然排序)或在定义TreeSet时通过构造器填入Comparator接口的实现对象(定制排序)。所以TreeSet使用的判断元素是否相同也是使用的Comparable接口中的compareTo()方法或Comparator接口中的compare()方法 Comparator接口
Comparable接口
TreeSet treeSet1 = new TreeSet();
//Employee类中实现了Comparable接口
treeSet1.add(new Employee("Tom",18,new MyDate(2002,3,5)));
treeSet1.add(new Employee("Jerry",19,new MyDate(2001,6,5)));
treeSet1.add(new Employee("Mary",22,new MyDate(1999,8,25)));
treeSet1.add(new Employee("Bob",21,new MyDate(2000,9,15)));
treeSet1.add(new Employee("Vector",23,new MyDate(1997,3,5)));
System.out.println(treeSet1);
//定制排序,匿名方式实现Comparator接口
TreeSet treeSet2 = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Employee && o2 instanceof Employee){
Employee e1 = (Employee)o1;
Employee e2 = (Employee)o2;
if (e1.getBirthday().getYear() > e2.getBirthday().getYear()){
return 1;
}else if (e1.getBirthday().getYear() < e2.getBirthday().getYear()){
return -1;
}else {
if (e1.getBirthday().getMonth() > e2.getBirthday().getMonth()){
return 1;
}else if (e1.getBirthday().getMonth() < e2.getBirthday().getMonth()){
return -1;
}else {
if (e1.getBirthday().getDay() > e2.getBirthday().getDay()){
return 1;
}else if (e1.getBirthday().getDay() < e2.getBirthday().getDay()){
return -1;
}else return 0;
}
}
}
throw new RuntimeException("输入有误");
}
});
treeSet2.add(new Employee("Tom",18,new MyDate(2002,3,5)));
treeSet2.add(new Employee("Jerry",19,new MyDate(2001,6,5)));
treeSet2.add(new Employee("Mary",22,new MyDate(1999,8,25)));
treeSet2.add(new Employee("Bob",21,new MyDate(2000,9,15)));
treeSet2.add(new Employee("Vector",23,new MyDate(2002,3,9)));
System.out.println(treeSet2);