黑马程序员技术交流社区

标题: TreeSet集合如何对元素排序 [打印本页]

作者: student    时间: 2013-5-30 10:03
标题: TreeSet集合如何对元素排序
本帖最后由 student 于 2013-5-31 08:09 编辑

毕老师在视频中说:TreeSet集合会对元素进行自然排序。
下面的例子输出字符串时,确实是按照字符串的自然顺序输出的,那么TreeSet集合是如何实现自然排序的呢?
  1. public class TreeSetDemo {
  2.         public static void main(String[] args) {

  3.                 Set<String> treeSet = new TreeSet<String>();
  4.                 treeSet.add("b");
  5.                 treeSet.add("c");
  6.                 treeSet.add("a");

  7.                 Iterator<String> it = treeSet.iterator();
  8.                 while (it.hasNext()) {
  9.                         System.out.println(it.next());
  10.                 }
  11.                
  12.                 /*运行结果:
  13.                  * a
  14.                  * b
  15.                  * c
  16.                  */
  17.         }
  18. }
复制代码

作者: 袁梦希    时间: 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