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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© student 中级黑马   /  2013-5-30 10:03  /  2643 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
哥们疯了   你这是要突破30分啊

点评

哥们辛苦了。。。。。我对不起你啊 。希希。。  发表于 2013-5-30 23:05
回复 使用道具 举报
袁梦希 发表于 2013-5-30 10:04
哥们疯了   你这是要突破30分啊

呵呵!多多交流,互相学习。
回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报

这是因为字符串类实现了 Compareble 接口,覆盖了 hashCode() 和 equals() 方法,这里的 equals() 方法就是按照自然排序进行编写的,所以会进行自然排序。

对于自己定义的类是不会实现自然排序的,除非要么实现Compareble 接口,要么定义一个比较器类,使之有自然排序的功能,否则会编译出错。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String类是实现了Comparable接口的。

public final class String extends Object
                        implements Serializable,
                        Comparable<String>,
                        CharSequence

所以 TreeSet集合添加String类型的元素就可以采用String的自然排序方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马