黑马程序员技术交流社区

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

作者: lengmianluocha    时间: 2013-8-9 21:29
标题: TreeSet的问题
本帖最后由 lengmianluocha 于 2013-8-10 17:59 编辑

今天看毕老师将的TreeSet的视频有个疑问。具体阐述如下:TreeSet集合排序有两种方式,一种是让元素具有比较性,另一种是让集合自身具有比较性。对于第一种,是要实现Comparable接口,覆盖compareTo方法,这里的代码如下:
  1. public int compareTo(Object obj)
  2.         {

  3.                 //return 0;
  4.                
  5.                 if(!(obj instanceof Student))
  6.                         throw new RuntimeException("不是学生对象");
  7.                 Student s = (Student)obj;

  8.                 //System.out.println(this.name+"....compareto....."+s.name);
  9.                 if(this.age>s.age)
  10.                         return 1;
  11.                 if(this.age==s.age)
  12.                 {
  13.                         return this.name.compareTo(s.name);
  14.                 }
  15.                 return -1;
  16.                 /**/
  17.         }
复制代码
对于第二种方式,是让集合自身具有比较性,这里定义一个实现了comparator接口的比较器,覆盖了compare方法,这里的代码如下:
  1. {
  2.                 Student s1 = (Student)o1;
  3.                 Student s2 = (Student)o2;

  4.                 int num = s1.getName().compareTo(s2.getName());
  5.                 if(num==0)
  6.                 {

  7.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  8.                         
  9.                 }
  10.                 return num;
  11.         }
复制代码
问,对于第二种实现排序的方式,如何体现让集合自身具有比较性?



作者: py强子    时间: 2013-8-9 23:57
如果第一种方式满足,没有必要定义比较器:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
对于如何体现让集合自身具有比较性?
TreeSet有构造方式接受比较器;public TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行相互比较:
如果该参数为 null,则使用元素的自然顺序。
作者: sergio    时间: 2013-8-10 02:09
重写Comoarator中两个方法。compare(T o1, T o2)\equals(Object obj)
int compare(T o1,T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。在前面的描述中,符号 sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -1、0 或 1。实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。(jdk 中的解释)让两个对象相减根据返回值跟0、-1、1做比较插入排序中的问题.

boolean equals(Object obj)指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。

注意,不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。







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