黑马程序员技术交流社区
标题: TreeSet集合如何对元素排序 [打印本页]
作者: student 时间: 2013-5-30 10:03
标题: TreeSet集合如何对元素排序
本帖最后由 student 于 2013-5-31 08:09 编辑
毕老师在视频中说:TreeSet集合会对元素进行自然排序。
下面的例子输出字符串时,确实是按照字符串的自然顺序输出的,那么TreeSet集合是如何实现自然排序的呢?- public class TreeSetDemo {
- public static void main(String[] args) {
- Set<String> treeSet = new TreeSet<String>();
- treeSet.add("b");
- treeSet.add("c");
- treeSet.add("a");
- Iterator<String> it = treeSet.iterator();
- while (it.hasNext()) {
- System.out.println(it.next());
- }
-
- /*运行结果:
- * a
- * b
- * c
- */
- }
- }
复制代码
作者: 袁梦希 时间: 2013-5-30 10:04
哥们疯了 你这是要突破30分啊
作者: student 时间: 2013-5-30 10:05
袁梦希 发表于 2013-5-30 10:04
哥们疯了 你这是要突破30分啊
呵呵!多多交流,互相学习。
作者: 花开花落总相似 时间: 2013-5-30 10:16
TreeSet:底层数据结构是二叉树。 保证元素唯一性的依据: compareTo方法return 0.TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。 TreeSet排序第一种方式:import java.util.*;
public class DemoTree{
public static void main(String[]args){
TreeSet ts = new TreeSet();
ts.add(new Person("zhangsan 01",22));
ts.add(new Person("zhangsan 05",20));
ts.add(new Person("zhangsan 02",15));
ts.add(new Person("zhangsan 08",29));
Iterator it = ts.iterator();
while(it.hasNext()){
//这里注意对象的调用
Person p = (Person)it.next();
output(p.getName()+"......."+p.getAge());
}
}
public static void output(Object obj){
System.out.println(obj);
}
}
//让不具备比较性的类实现Comparable接口从而具备比较性
class Person implements Comparable{
private String name;
private int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
//对compareTo方法进行覆写 按照我们想要的排序方式排序
public int compareTo(Object obj){
if(!(obj instanceof Person))
throw new RuntimeException("该对象不是学生");
Person s = (Person) obj;
if(this.age>s.age)
return 1;
if(this.age<s.age)
return -1;
if(this.age == s.age){
return this.name.compareTo(s.name);
}
return 0;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
注意:要理解Comparable 和Comparator
Comparable 这个是可比较的 就是有没有比较性的意思 那理所当然的 有没有比较性 肯定是与另外一个对象相比较了所以需要覆写的方法是 compareTo
Comparator 这个是比较器的意思 也就是说 这个是要传到集合中去的 而且比较器肯定是要有2个对象才能比较了 所以这个需要覆写的是 compare
作者: 石贤芝 时间: 2013-5-30 21:48
这是因为字符串类实现了 Compareble 接口,覆盖了 hashCode() 和 equals() 方法,这里的 equals() 方法就是按照自然排序进行编写的,所以会进行自然排序。
对于自己定义的类是不会实现自然排序的,除非要么实现Compareble 接口,要么定义一个比较器类,使之有自然排序的功能,否则会编译出错。
作者: Super_Class 时间: 2013-5-30 22:03
String类是实现了Comparable接口的。
public final class String extends Object
implements Serializable,
Comparable<String>,
CharSequence
所以 TreeSet集合添加String类型的元素就可以采用String的自然排序方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |