A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 Kevin.Kang 于 2015-7-17 14:41 编辑
  1. package com.kxg.set;

  2. import java.util.TreeSet;

  3. /*
  4. * TreeSet:能够对元素按照某种规则进行排序。
  5. * 特点:
  6. *                 排序和唯一
  7. * 排序的两种方式:
  8. *                 自然排序
  9. *                         实现Comparable接口中的compareTo()方法
  10. *                 比较器排序
  11. *                         实现Comparator接口中的Comparator()方法
  12. *
  13. */
  14. public class TreeSetDemo {
  15.         public static void main(String[] args) {

  16.                 // Integer中已经重写了compareTo()方法,可以写成无参构造。
  17.                 TreeSet<Integer> set = new TreeSet<Integer>();

  18.                 set.add(25);
  19.                 set.add(22);
  20.                 set.add(24);
  21.                 set.add(25);
  22.                 set.add(29);
  23.                 set.add(28);
  24.                 set.add(25);
  25.                 set.add(45);
  26.                 set.add(32);
  27.                 set.add(89);
  28.                 set.add(12);

  29.                 for (Integer i : set) {
  30.                         System.out.println(i);
  31.                 }
  32.         }
  33. }
复制代码


3 个回复

正序浏览
Stuent类:
  1. package com.kxg.set;

  2. public class Student implements Comparable<Student> {
  3.         private String name;
  4.         private int age;

  5.         public Student() {
  6.                 super();
  7.         }

  8.         public Student(String naem, int age) {
  9.                 super();
  10.                 this.name = naem;
  11.                 this.age = age;
  12.         }

  13.         public String getName() {
  14.                 return name;
  15.         }

  16.         public void setName(String naem) {
  17.                 this.name = naem;
  18.         }

  19.         public int getAge() {
  20.                 return age;
  21.         }

  22.         public void setAge(int age) {
  23.                 this.age = age;
  24.         }

  25.         @Override
  26.         public int hashCode() {
  27.                 final int prime = 31;
  28.                 int result = 1;
  29.                 result = prime * result + age;
  30.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  31.                 return result;
  32.         }

  33.         @Override
  34.         public String toString() {
  35.                 return name + "==" + age;
  36.         }

  37.         @Override
  38.         public boolean equals(Object obj) {
  39.                 if (this == obj)
  40.                         return true;
  41.                 if (obj == null)
  42.                         return false;
  43.                 if (getClass() != obj.getClass())
  44.                         return false;
  45.                 Student other = (Student) obj;
  46.                 if (age != other.age)
  47.                         return false;
  48.                 if (name == null) {
  49.                         if (other.name != null)
  50.                                 return false;
  51.                 } else if (!name.equals(other.name))
  52.                         return false;
  53.                 return true;
  54.         }

  55.         @Override
  56.         public int compareTo(Student s) {
  57.                 // 主要条件:按照名字长度排序
  58.                 int num = this.name.length() - s.name.length();
  59.                 // 次要条件:名字长度相同,不代表名字内容相同
  60.                 // 如果名字长度相同,就比较名字内容是否相同
  61.                 int num2 = num == 0 ? this.name.compareTo(s.name) : num;
  62.                 // 名字内容相同,不代表年龄相同
  63.                 // 如果名字内容相同,比较对象的年龄是否相同,如果相同就认为是同一个对象,不添加
  64.                 int num3 = num2 == 0 ? this.age - s.age : num2;
  65.                 return num3;
  66.         }
  67. }
复制代码



回复 使用道具 举报
摘抄强哥:

        a.自然顺序(Comparable)
                对象实现Comparable接口
                TreeSet类的add()方法中会把存入的对象提升为Comparable类型
                调用对象的compareTo()方法和集合中的对象比较
                根据compareTo()方法返回的结果进行存储

        b.比较器顺序(Comparator)
                创建TreeSet的时候可以制定 一个Comparator
                如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
                add()方法内部会自动调用Comparator接口中compare()方法排序

        c.两种方式的区别
                TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
                TreeSet如果传入Comparator, 就优先按照Comparator

回复 使用道具 举报
本帖最后由 Kevin.Kang 于 2015-7-21 14:38 编辑
  1. package com.kxg.set;

  2. import java.util.Comparator;
  3. import java.util.TreeSet;
  4. public class TreeSetDemo2 {
  5.         public static void main(String[] args) {
  6.                 TreeSet<Student> set = new TreeSet<Student>();

  7.                 TreeSet<Student> set2 = new TreeSet<>(new Comparator<Student>() {

  8.                         @Override
  9.                         public int compare(Student s1, Student s2) {
  10.                                 // 主要条件:按照名字长度排序,访问不到Student类中的name和age,换用getXxx方法得到。
  11.                                 int num = s1.getName().length() - s2.getName().length();
  12.                                 // 次要条件:名字长度相同,不代表名字内容相同
  13.                                 // 如果名字长度相同,就比较名字内容是否相同
  14.                                 int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
  15.                                                 : num;
  16.                                 // 名字内容相同,不代表年龄相同
  17.                                 // 如果名字内容相同,比较对象的年龄是否相同,如果相同就认为是同一个对象,不添加
  18.                                 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
  19.                                 return num3;
  20.                         }

  21.                 });
  22.                 Student s1 = new Student("kangxiaoguang", 23);
  23.                 Student s2 = new Student("liyanxu", 20);
  24.                 Student s3 = new Student("renxingya", 23);
  25.                 Student s4 = new Student("zhaolei", 19);
  26.                 Student s5 = new Student("wangao", 21);
  27.                 Student s6 = new Student("kangxiaoguang", 23);
  28.                 Student s7 = new Student("renxingya", 33);
  29.                 Student s8 = new Student("liyanxu", 20);
  30.                 Student s9 = new Student("liyanxu", 22);

  31.                 set.add(s1);
  32.                 set.add(s2);
  33.                 set.add(s3);
  34.                 set.add(s4);
  35.                 set.add(s5);
  36.                 set.add(s6);
  37.                 set.add(s7);
  38.                 set.add(s8);
  39.                 set.add(s9);

  40.                 set2.add(s1);
  41.                 set2.add(s2);
  42.                 set2.add(s3);
  43.                 set2.add(s4);
  44.                 set2.add(s5);
  45.                 set2.add(s6);
  46.                 set2.add(s7);
  47.                 set2.add(s8);
  48.                 set2.add(s9);

  49.                 for (Student s : set) {
  50.                         System.out.println(s);
  51.                 }
  52.         }
  53. }
复制代码

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马