黑马程序员技术交流社区
标题:
TreeSet的问题
[打印本页]
作者:
lengmianluocha
时间:
2013-8-9 21:29
标题:
TreeSet的问题
本帖最后由 lengmianluocha 于 2013-8-10 17:59 编辑
今天看毕老师将的TreeSet的视频有个疑问。具体阐述如下:TreeSet集合排序有两种方式,一种是让元素具有比较性,另一种是让集合自身具有比较性。对于第一种,是要实现Comparable接口,覆盖compareTo方法,这里的代码如下:
public int compareTo(Object obj)
{
//return 0;
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
//System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
/**/
}
复制代码
对于第二种方式,是让集合自身具有比较性,这里定义一个实现了comparator接口的比较器,覆盖了compare方法,这里的代码如下:
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
if(num==0)
{
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
复制代码
问,对于第二种实现排序的方式,如何体现让集合自身具有比较性?
作者:
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