黑马程序员技术交流社区
标题:
treeset 排序原理
[打印本页]
作者:
苗超维
时间:
2016-1-15 16:30
标题:
treeset 排序原理
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 的构造器中,也能实现上面排序的效果
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2