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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苗超维 中级黑马   /  2016-1-15 16:30  /  922 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列。和hashset 最大的不同是TreeSet可以用来排序,它利用了二叉树的性质,右子树上的值要小于左子树上的值。
    对于基本数据类型包装类的存储,下面以string类为例:
                           TreeSet<String> ts = new TreeSet<>();  
                             ts.add("aaaaaaaa");
                             ts.add("z");
                             ts.add("wc");
                             ts.add("nba");
                             ts.add("cba");
      与hashset 不同,利用树的性质而不是再使用hashcode(),与equal()方法,而是通过实现Comparable接口,重写其compareTo()方法来实现,当compareTo()方法返回0时,表示与集合中的数据相同,不在存储,compareTo()方法返回正数时,放在所比较数据的右子树上,而compareTo()方法返回负数时,则放在数据的左子树上。string类实现的方法是比较字符串的字典顺序来排序
    当TreeSet存储的是自定义对象时,需要这时候我们应该实现这个接口重写compareTo()方法,按照我们定义的方法来排序,例如;
TreeSet<Person> ts = new TreeSet<>();
  ts.add(new Person("zhangsan", 23));
  ts.add(new Person("lisi", 13));
  ts.add(new Person("wangwu", 33));
  ts.add(new Person("zhaoliu", 43));
  ts.add(new Person("aaaa", 53));
      这时候我们在person类中实现Comparable接口,重写ComparableTo()方法:
[url=]/*@Override[/url]
//按照年龄排序
public int compareTo(Person o) {
  int num = this.age - o.age;    //年龄是比较的主要条件
  return num == 0 ? this.name.compareTo(o.name) : num;//姓名是比较的次要条件
}
例如 这时我们就是按照年龄来排序,
除了这种方式我们还可以用排序器来排序  :

class CompareByLen /*extends Object*/ implements Comparator<String> {
@Override
public int compare(String s1, String s2) {  //按照字符串的长度比较
  int num = s1.length() - s2.length();  //长度为主要条件
  return num == 0 ? s1.compareTo(s2) : num; //内容为次要条件
}
我们创建一个实现了 Comparator的排序器类,方法是要求我们按照长度比较,内容为次要条件,
TreeSet<String> ts = new TreeSet<>(new CompareByLen());  //Comparator c = new CompareByLen();
  ts.add("aaaaaaaa");
  ts.add("z");
  ts.add("wc");
  ts.add("nba");
  ts.add("cba");
      这里我们创建出这个排序器对象,将它传入TreeSet 的构造器中,也能实现上面排序的效果




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马