当前位置:  首页>> 技术小册>> Java语言基础10-Java中的集合

5.3.1 概述

  • TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
  • TreeSet 底层使用红黑树结构存储数据,在内部使用的是 TreeMap 来实现的。

TreeSet 有两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。

5.3.2 自然排序

  • 自然排序:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列。
  • 如果视图将一个对象添加到 TreeSet 中,则该对象所属的类必须实现 Comparable 接口。
  • Comparable 的实现:

    • BigDecimal 、BigInteger 以及所有的数值型对应的包装类:按照它们对应的数值大小进行比较。
    • Character :按照字符的 Unicode 值进行比较。
    • Boolean :true 对应的包装类实例大于 false 对应的包装类实例。
    • String :按照字符串中字符的 Unicode 值进行比较。
    • Date 、Time :后面的时间、日期比前面的时间、日期大。
  • 示例:

  1. package com.github.set.demo4;
  2. import java.util.Set;
  3. import java.util.TreeSet;
  4. /**
  5. * @author maxiaoke.com
  6. * @version 1.0
  7. *
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. Set<String> set = new TreeSet<>();
  12. set.add("g");
  13. set.add("b");
  14. set.add("d");
  15. set.add("c");
  16. set.add("f");
  17. System.out.println("set = " + set); // set = [b, c, d, f, g]
  18. }
  19. }

示例:

  1. package com.github.set.demo5;
  2. /**
  3. * @author maxiaoke.com
  4. * @version 1.0
  5. *
  6. */
  7. public class Person implements Comparable<Person> {
  8. private String name;
  9. private int age;
  10. public Person() {}
  11. public Person(String name, int age) {
  12. this.name = name;
  13. this.age = age;
  14. }
  15. public String getName() {
  16. return this.name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getAge() {
  22. return this.age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. @Override
  28. public int compareTo(Person o) {
  29. return Integer.compare(this.getAge(), o.getAge());
  30. }
  31. @Override
  32. public String toString() {
  33. return "Person{" + "name='" + this.name + '\'' + ", age='" + this.age + '\'' + '}';
  34. }
  35. }
  1. package com.github.set.demo5;
  2. import java.util.Set;
  3. import java.util.TreeSet;
  4. /**
  5. * @author maxiaoke.com
  6. * @version 1.0
  7. *
  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11. Set<Person> set = new TreeSet<>();
  12. set.add(new Person("张三", 15));
  13. set.add(new Person("李四", 99));
  14. set.add(new Person("王五", 58));
  15. set.add(new Person("赵六", 9));
  16. set.add(new Person("田七", 1));
  17. set.add(new Person("王八", 44));
  18. // set = [Person{name='田七', age='1'}, Person{name='赵六', age='9'}, Person{name='张三', age='15'}, Person{name='王八',
  19. // age='44'}, Person{name='王五', age='58'}, Person{name='李四', age='99'}]
  20. System.out.println("set = " + set);
  21. }
  22. }

5.3.3 定制排序

  • 定制排序,通过 Comparator 接口来实现。需要重写 compare(T o1,T o2) 方法。
  • 利用 int compare(T o1,T o2) 方法,比较 o1 和 o2 的大小:如果方法返回正整数,则表示 o1 大于 o2 ;如果返回 0 ,表示相等;返回负整数,表示 o1 小于 o2 。
  • 要实现定制排序,需要将实现 Comparator 接口的实例作为形参传递给 TreeSet 的构造器。
  • 使用定制排序判断两个元素相等的标准是:通过 Comparator 比较两个元素返回了 0 。

  • 示例:

  1. package com.github.set.demo6;
  2. /**
  3. * @author maxiaoke.com
  4. * @version 1.0
  5. *
  6. */
  7. public class Person {
  8. private String name;
  9. private int age;
  10. public Person() {}
  11. public Person(String name, int age) {
  12. this.name = name;
  13. this.age = age;
  14. }
  15. public String getName() {
  16. return this.name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getAge() {
  22. return this.age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. @Override
  28. public String toString() {
  29. return "Person{" + "name='" + this.name + '\'' + ", age='" + this.age + '\'' + '}';
  30. }
  31. }
  1. package com.github.set.demo6;
  2. import java.util.Comparator;
  3. import java.util.Set;
  4. import java.util.TreeSet;
  5. /**
  6. * @author maxiaoke.com
  7. * @version 1.0
  8. *
  9. */
  10. public class Test {
  11. public static void main(String[] args) {
  12. Set<Person> set = new TreeSet<>(new Comparator<Person>() {
  13. @Override
  14. public int compare(Person o1, Person o2) {
  15. return Integer.compare(o2.getAge(), o1.getAge());
  16. }
  17. });
  18. set.add(new Person("张三", 15));
  19. set.add(new Person("李四", 99));
  20. set.add(new Person("王五", 58));
  21. set.add(new Person("赵六", 9));
  22. set.add(new Person("田七", 1));
  23. set.add(new Person("王八", 44));
  24. // set = [Person{name='李四', age='99'}, Person{name='王五', age='58'}, Person{name='王八', age='44'}, Person{name='张三', age='15'}, Person{name='赵六', age='9'}, Person{name='田七', age='1'}]
  25. System.out.println("set = " + set);
  26. }
  27. }

该分类下的相关小册推荐: