TreeSet类
- 基于排序顺序实现不重复。
- 实现了SortedSet接口,对集合元素自动排序。
- 元素对象的类型必须实现Comparable接口,指定排序规则。
- 通过CompareTo方法确定是否为重复元素。
- 存储结构:红黑树
- 要求:元素类必须实现Comparable接口,compareTo方法返回0,认为是重复元素
1. TreeSet
TreeSet<Person> persons = new TreeSet<Person>();
Person p1 = new Person("tang", 21);
Person p2 = new Person("he", 22);
Person p3 = new Person("yu", 21);
// 1.添加元素
persons.add(p1);
persons.add(p2);
persons.add(p3);
// 注:直接添加会报类型转换错误,需要实现Comparable接口
System.out.println(persons.toString());
// 2.删除元素
persons.remove(p1);
persons.remove(new Person("he", 22));
System.out.println(persons.toString());
// 3.遍历(略)
// 4.判断
System.out.println(persons.contains(new Person("yu", 21)));
2. Comparable
Comparable接口的源码,只有一个compareTo抽象方法
public interface Comparable<T> {
public int compareTo(T o);
}
继承Comparable接口并重写Person中的compareTo方法
public class Person implements Comparable<Person>{
@Override
// 1.先按姓名比
// 2.再按年龄比
public int compareTo(Person o) {
int n1=this.getName().compareTo(o.getName());
int n2=this.age-o.getAge();
return n1==0?n2:n1;
}
}
除了实现Comparable接口里的比较方法,TreeSet也提供了一个带比较器Comparator的构造方法,使用匿名内部类来实现它:
TreeSet<Person> persons = new TreeSet<Person>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
// 先按年龄比较
// 再按姓名比较
int n1 = o1.getAge() - o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1 == 0 ? n2 : n1;
}
});
Person p1 = new Person("tang", 21);
Person p2 = new Person("he", 22);
Person p3 = new Person("yu", 21);
persons.add(p1);
persons.add(p2);
persons.add(p3);
System.out.println(persons.toString());
3. 案例
要求:使用TreeSet集合实现字符串按照长度进行排序
如:
helloworld tangrui hechengyang wangzixu yuguoming
Comparator接口实现定制比较
TreeSet<String> strings = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length() - o2.length();
int n2 = o1.compareTo(o2);
return n1 == 0? n2 : n1;
}
});
strings.add("helloworld");
strings.add("pingguo");
strings.add("lisi");
strings.add("zhangsan");
strings.add("beijing");
strings.add("cat");
strings.add("nanjing");
strings.add("xian");
System.out.println(strings.toString());