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. 案例

  1. 要求:使用TreeSet集合实现字符串按照长度进行排序

    如:helloworld tangrui hechengyang wangzixu yuguoming

  2. 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());
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""