博客> Java Collection类的学习---Set子类--TreeSet
Java Collection类的学习---Set子类--TreeSet
2017-12-10 07:32 评论:0 阅读:239 西单_夜未央
JAVA comparator比较器 TreeSet

TreeSet类大部分还是与普通的集合方法还有用法相似:主要介绍下main两个点

1:TreeSet根据名字来说,有树的意思:的确TreeSet的元素的排序就是根据二叉树来的:

 A:以第一个元素为根节点
 B:以后的每个元素都从根节点比较,大的排右边(比节点还大那就一直右边下去),小的排左边(比节点还小那就一直左边下去)

 TreeSet如何保证元素的唯一性以及排序.png

2:TreeSet一个主要的就是根据构造方法不同,处理的地方也不同

public TreeSet(): 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。插入该 set 的所有元素都必须实现 Comparable 接口。另外,所有这些元素都必须是可互相比较的:对于 set 中的任意两个元素 e1 和 e2,执行 e1.compareTo(e2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的元素添加到 set(例如,用户试图将字符串元素添加到其元素为整数的 set 中),则 add 调用将抛出 ClassCastException。

public TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行相互比较:对于 set 中的任意两个元素 e1 和 e2,执行 comparator.compare(e1, e2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的元素添加到 set 中,则 add 调用将抛出 ClassCastException。

上面两个方法都提到一个Comparator这个叫做比较器的东西(稍微研究了一下,还挺好玩的)

它有三种方式: A:第一种就是匿名内部类的方式

TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
   @Override
   public int compare(Student o1, Student o2) {
    // TODO 自动生成的方法存根
    int num1 = o1.getAge() - o2.getAge();
    int num2 = num1 == 0? (o1.getName().compareTo(o2.getName())):num1;
    return num2;
   }
  });

B:另一种就是直接在Student这个自定义的研究类实现comparable这个接口,并且重写compareTo的方法

public class Student implements Comparable<Student>{

 private int age;
 private String name;

 public int getAge() {
  return age;
 }

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

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
 public Student(){

 }
 public Student(String name, int age){
  this.name = name;
  this.age = age;
 }

 @Override
 public String toString() {
  return "Student [age=" + age + ", name=" + name + "]";
 }

 @Override
 public int compareTo(Student o) {
  // TODO 自动生成的方法存根
  int num1 = o.getAge() - this.age;
  int num2 = num1 == 0? (o.getName().compareTo(this.getName())):num1;
  return num2;
 } 
}

C:自定义一个类MyComparator并且实现Comparator这个接口,还有重写compareTo的方法

public class MyComparator2 implements Comparator<Student> {

 @Override
 public int compare(Student s1, Student s2) {
  int num = s1.getAge() - s2.getAge();
  // 次要条件
  int num2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;
  return num2;
 }
}
收藏
0
sina weixin mail 回到顶部