一、了解

  1. TreeSet集合底层实际上是一个TreeMap
  2. TreeMap集合底层是一个二叉树
  3. 放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了
  4. TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序

二、怎么选择

image.png

三、自定义类型在TreeSet中的比较

1、第一种方式(放在集合中的元素实现java.lang.Comparable接口)

  1. package Map.javase;
  2. import java.util.TreeSet;
  3. public class TreeSetTest05 {
  4. public static void main(String[] args) {
  5. TreeSet<Vip> vips = new TreeSet<>();
  6. vips.add(new Vip("zhangsan",13));
  7. vips.add(new Vip("lise",13));
  8. vips.add(new Vip("zhangwu",13));
  9. for (Vip vip :vips){
  10. System.out.println(vip);
  11. }
  12. }
  13. }
  14. class Vip implements Comparable<Vip>{
  15. String name;
  16. int age;
  17. public Vip(String name, int age) {
  18. this.name = name;
  19. this.age = age;
  20. }
  21. @Override
  22. public String toString() {
  23. return "Vip{" +
  24. "name='" + name + '\'' +
  25. ", age=" + age +
  26. '}';
  27. }
  28. @Override
  29. public int compareTo(Vip o) {
  30. if (o.age == this.age) {
  31. return this.name.compareTo(o.name);
  32. }else {
  33. return this.age - o.age;
  34. }
  35. }
  36. }

2、第二种方式(使用比较器)

  1. package Map.javase;
  2. import java.util.Comparator;
  3. import java.util.TreeSet;
  4. public class TreeSetTest06 {
  5. public static void main(String[] args) {
  6. TreeSet<WuGui>wuGuis = new TreeSet<>(new WuGuiComparator());
  7. wuGuis.add(new WuGui(1000));
  8. wuGuis.add(new WuGui(200));
  9. wuGuis.add(new WuGui(10));
  10. for (WuGui wuGui : wuGuis){
  11. System.out.println(wuGui);
  12. }
  13. }
  14. }
  15. class WuGui{
  16. int age;
  17. public WuGui(int age) {
  18. this.age = age;
  19. }
  20. @Override
  21. public String toString() {
  22. return "WuGui{" +
  23. "age=" + age +
  24. '}';
  25. }
  26. }
  27. /**
  28. * 编写一个比较器
  29. * 比较器实现java.util.Comparator接口。(Comparable是java.lang包下的,Comparator是java。util包下的)
  30. */
  31. class WuGuiComparator implements Comparator<WuGui> {
  32. @Override
  33. public int compare(WuGui o1,WuGui o2) {
  34. return o1.age - o2.age;
  35. }
  36. }

也可以使用匿名内部类的方式

  1. package Map.javase;
  2. import java.util.Comparator;
  3. import java.util.TreeSet;
  4. public class TreeSetTest06 {
  5. public static void main(String[] args) {
  6. // TreeSet<WuGui>wuGuis = new TreeSet<>(new WuGuiComparator());
  7. TreeSet<WuGui>wuGuis = new TreeSet<>(new Comparator<WuGui>(){
  8. public int compare(WuGui o1 , WuGui o2){
  9. return o1.age - o2.age;
  10. }
  11. });
  12. wuGuis.add(new WuGui(1000));
  13. wuGuis.add(new WuGui(200));
  14. wuGuis.add(new WuGui(10));
  15. for (WuGui wuGui : wuGuis){
  16. System.out.println(wuGui);
  17. }
  18. }
  19. }
  20. class WuGui{
  21. int age;
  22. public WuGui(int age) {
  23. this.age = age;
  24. }
  25. @Override
  26. public String toString() {
  27. return "WuGui{" +
  28. "age=" + age +
  29. '}';
  30. }
  31. }
  32. /**
  33. * 编写一个比较器
  34. * 比较器实现java.util.Comparator接口。(Comparable是java.lang包下的,Comparator是java。util包下的)
  35. */
  36. /*
  37. class WuGuiComparator implements Comparator<WuGui> {
  38. @Override
  39. public int compare(WuGui o1,WuGui o2) {
  40. return o1.age - o2.age;
  41. }
  42. }
  43. */

四、最终结论