黑马程序员技术交流社区

标题: java TreeSet问题 [打印本页]

作者: hzhzhen    时间: 2015-5-23 10:49
标题: java TreeSet问题
在Student中实现Comparable接口并构造了实现Comparable接口的compareToStudent。下面是代码示例:
  1. import java.util.*;
  2. public class TreeSetTest {
  3.            public static void main(String[] args)
  4.            {
  5.                    //TreeSet ts=new TreeSet();
  6.                    TreeSet ts=new TreeSet(new Students.compareToStudent());
  7.                    ts.add(new Students(2,"zhangshan"));
  8.                    ts.add(new Students(3,"lishi"));
  9.                    ts.add(new Students(1,"wangwu"));         
  10.                   Iterator it=ts.iterator();
  11.                    while(it.hasNext())
  12.                    {
  13.                            System.out.println(it.next());
  14.                    }               
  15.            }
  16. }
  17. class Students implements Comparable
  18. {
  19.            int num;
  20.            String name;
  21.            Students(int num,String name)
  22.            {
  23.                    this.num=num;
  24.                    this.name=name;
  25.            }
  26. //定义一个内部类来实现比较器

  27.            static class compareToStudent implements Comparator        
  28.           {
  29.                    public int compare(Object o1, Object o2) {
  30.                            Students s1=(Students)o1;
  31.                            Students s2=(Students)o2;
  32.                            int rulst= s1.num > s2.num ? 1 : (s1.num==s2.num ? 0 :-1);
  33.                            if(rulst==0)
  34.                            {
  35.                                    rulst=s1.name.compareTo(s2.name);
  36.                            }               
  37.                            return rulst;
  38.                    }               
  39.            }
  40. //写具体的比较方法

  41.            public int compareTo(Object o)               
  42.           {
  43.                    int result;
  44.                    Students s=(Students)o;
  45.                    result=num >s.num ? 1:(num==s.num ? 0 : -1);
  46.                    if(result==0)
  47.                    {
  48.                            result=name.compareTo(s.name);
  49.                    }
  50.                    return result;
  51.            }
  52.            public String toString()
  53.            {
  54.                    return num+":"+name;
  55.            }
  56. }
复制代码

我就想知道
  static class compareToStudent implements Comparator  {.......   }
和 public int compareTo(Object o)  {.....}的区别是什么,感觉代码都差不多呗???

作者: mmakun    时间: 2015-5-23 13:14
一个是类,一个是匿名类,就这么点区别
作者: wangkai    时间: 2015-5-23 16:40
有比较器以比较器为准,没有比较器,用compareTo比较。
作者: guojiadui    时间: 2015-5-23 17:20
一个在对象上现实排序、一个在集合中现实排序,看具体需要用吧
作者: l598790586    时间: 2015-5-23 23:08
public int compareTo(Object o)  {.....}是实现接口Comparable后复写compareTo方法static class compareToStudent implements Comparator  {.......   }是定义一个类实现Comparator接口,复写compare方法,
Comparator 和 Comparable 相同的地方:
他们都是java的一个接口, 并且是用来对自定义的class比较大小的
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,
但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义
的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自
己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了





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