黑马程序员技术交流社区

标题: 关于TreeSet集合,高手来解答 [打印本页]

作者: 孙浩迪    时间: 2012-6-12 23:58
标题: 关于TreeSet集合,高手来解答
本帖最后由 sunhaodi 于 2012-6-19 14:40 编辑

package day2;

import java.util.Iterator;
import java.util.TreeSet;

import javax.management.RuntimeErrorException;

public class TestDemo {

         
        public static void main(String[] args) {
               
        
                  TreeSet   t = new TreeSet();
                  
                  t.add(new Test("java10",29));
                  t.add(new Test("java15",24));
                  t.add(new Test("java18",57));
                  t.add(new Test("java20",20));
                  
                  Iterator it = t.iterator();
                  
                  while(it.hasNext()){
                          
                          Test tt=(Test)it.next();
                          
                           System.out.println(tt.getName()+"........"+tt.getAge());
                  }         
        }
}
class Test implements Comparable{
        
        private String name;
        private int age;
        
        public Test(String name,int age){
                  this.name=name;
                  this.age=age;
        }

    @Override
    public int compareTo(Object o) {
            if(!(o instanceof Test))
            throw new RuntimeException( "不是Test对象");
                Test t=(Test)o;
             System.out.println(this.name+".........."+t.name);   
             if(this.age>t.age)
            
              return 1;
            
             if(this.age==t.age){
                     
                      return t.name.compareTo(this.name);
             }
            
             return -1;
            
            
            
    }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }
   
   
        
        
}

-------------------------------------------

@Override
    public int compareTo(Object o) {
            if(!(o instanceof Test))
            throw new RuntimeException( "不是Test对象");
                Test t=(Test)o;
             System.out.println(this.name+".........."+t.name);   
             if(this.age>t.age)
            
              return 1;
            
             if(this.age==t.age){
                     
                      return t.name.compareTo(this.name);
             }
            
             return -1;
            

这里面怎么倒序排序啊?  还有这是怎么比较的,听毕老师讲完了还是有点没懂,希望有高手解答下








作者: 赵兵锋    时间: 2012-6-13 00:18
compareTo(o),会将自己与o进行比较,默认的规则是自己小于o就返回-1,自己等于o就返回0,自己大于o就返回1。至于怎么比较大小就看compareTo方法里自己怎么写了。上面的代码里,通过比较成员变量age的值的大小来确定两个对象的大小的,若age相等,则判断另一成员变量name的大小。倒序排序就是将上面所说的规则颠倒,小于返回1,等于返回0,大于返回-1.
作者: 孙峰    时间: 2012-6-13 00:56
首先一个知识点:TreeSet 中元素的排序,如果元素自身带有排序功能,而且可用,那么就按此排序进行存储。   没有的话,使元素类实现comparable 接口,覆盖 compareTo方法。自定义排序。
                        元素对象不具有排序时, 使TreeSet 集合有排序功能, 实现comparator 接口,覆盖 compare方法即可。

该例子中让 元素对象new Test() 自定义具有排序功能。 功能:先比较age,当age相当时 比较name.

再一个知识点:TreeSet中元素存储结构:二叉树,总结一下就是:我先来,你后来和我比,比我小就放我左下方,比我大就放右下方。(结构自己画图理解)。
当二叉树往外输出时:默认从小到大取,也就是从左往右。

该例子中,怎么知道你比我是大还是小呢?   就是参考你return的值, 是1时,你比我大,放我右下方,是-1时,你比我小,放我左下方………………按这个规律存放。

那怎么实现倒序输出呢?
如果将两者元素的比较值 始终返回 1, 假如你输入顺序是:A -B-C-D,  此时始终返回1,系统会认为A<B<C<D。
那么二叉树的存储就是: A
                                           \                                                                                                   
                                            B
                                                  \
                                                   C
                                                     \D.  当取出是从左到右,  即输出:A-B-C-D,  这是按输入顺序输出。
            
同理,始终返回-1时,就是倒序了。这个楼主自己画一把。

作者: 王月    时间: 2012-6-13 10:18

LZ首先要明白一点,TreeSet实现排序的原理是compareTo方法返回的值是否为正数、负数或0。
1,compareTo方法是定义在集合内部的,不用调用会在程序启动时自动运行。
2,只要程序执行时发现compareTo方法返回值为整数(一般写 1),如果恒为整数,则元素默认从小到大排序。所以这里age是按从小到大排序的,
因此如果想实现倒序也就是从大到小排序,可以直接将">"改为"<"
if(this.age>t.age)
return 1;

3,如果返回值为0则比较的两个元素相等。这里因为age相等相当于返回值为0,所以又判断名字是否相同,毕老师讲这道题也是为了如果年龄相同在比较姓名。
if(this.age==t.age){
return t.name.compareTo(this.name);
}


4,如果恒返回-1,则会从大到小排序。这里判断的其实也是if(this.age<age)的情况。
return -1;


学集合的时候我也在这里思考了很久,lz好好理解compareTo实现排序的原理,就是看他的返回值。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2