黑马程序员技术交流社区

标题: 比较器的问题 [打印本页]

作者: 尹善波    时间: 2012-7-24 01:26
标题: 比较器的问题
//简单的字母排列
import java.util.*;
class  TreeSetTest
{
public static void main(String[] args)
{
  TreeSet ts = new TreeSet(new StrLenComparator());
  ts.add("abcd");
  ts.add("cc");
  ts.add("cba");
  ts.add("aaa");
  ts.add("z");
  ts.add("hahaha");
  Iterator it = ts.iterator();
  while(it.hasNext())
  {
   System.out.println(it.next());
  }
}
}
class StrLenComparator implements Comparator
{
public int compare(Object o1,Object o2)//当第一个参数传进来时,比较器中原本是空的,那第一个参数和null怎么比;
                                     //第二个参数来时和第一个比较,返回值是-1,0,或正整数,这些int类型的返回值
          //有什么作用,怎么来确定参数的顺序,,以后的参数传进来时先和谁比较后和谁比较有什么依据吗?
{
  String s1 = (String)o1;
  String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
  if(num==0)
   return s1.compareTo(s2);
  return num;
}
}
//Comparator和Comparable有什么区别啊,他们与equals又有什么联系

作者: 郭凯敏    时间: 2012-7-24 01:49
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
第一个与null比较,所以他留下;
第二个由于第一个比较,这两个又确定一个顺序(长度小的在前)
第三个进来又继续和前两个比较,重新按照长度改变顺序;-----以此类推比完所有。
当长度相同时,又调用默认的compareTo方法进行自然排序。
憋死我了,表达不出来了......
作者: 金龙    时间: 2012-7-24 03:17
先说下TreeSet的特点吧,由于TreeSet的底层数据结构是二叉树,所以,它里面装的元素一定是有序的,也就是说,里面存储的元素一定要有比较性。而java提供的例如String,Integer……这些类,自身都具有比较性,所以存入里面都会按照顺序排列。

那么,如果想存储自定义的对象呢?在自定义的对象没有比较性的情况下,只能存一个,不能存第二个,也就是说,当TreeSet中只有一个元素的时候,是不需要比较的。
所以,想要存自定义的对象的时候,就一定要保证该类的对象都具有比较性,那么如何实现呢?实现Comparable,并覆盖其中的compareTo方法,在其中写入你自定义的比较方式,大小排序,相等则不排,也就是说,实现Comparable去保证自己比较性的类,去判断元素大小,以及元素是否相同的依据是compareTo,与equals无关
而很多时候,或许你存的对象是别人写的类,也就是说,你不知道这个类会不会有比较性,并且,就算有比较性,会不会是你想要的那种排序方式,这时候,我们可以自定义一个比较器,也就是实现Comparator
通过实现Comparator,去覆盖其中的compare方法,就能得到我们想要的比较方式,再将此比较器传入TreeSet的构造中,就可以使用了,同理,如果使用自定义比较器,那么,判断对象是否相同,以及它们的大小关系仅仅只依据Comparator方法,也与equals无关
C:\Users\Administrator\Desktop\图解.jpg
至于比较的先后顺序,我草草画个图吧
作者: 金龙    时间: 2012-7-24 03:18
晕死,上传不了图片么????
作者: 金龙    时间: 2012-7-24 03:21
这是我画的,看起来好小啊,也不知道发过去怎么样

图解.jpg (110.28 KB, 下载次数: 51)

图解.jpg

作者: 李菁    时间: 2012-7-24 10:00
TreeSet是一个有序的集合,它的元素按照升序排序,默认是按自然顺序排序,所以TreeSet对象要实现Comparable接口。Comparable接口里定义了一个compareTo(Object obj)方法,这个方法返回一个整数值,实现Comparable接口必须实现compare To方法,实现这个接口的对象就可以比较大小。
compareTo是将当前对象与参数obj这个对象比,当前对象大,就返回个正值;当前对象小,就返回个负值;一样大就返回0

Comparable 是一个对象本身支持自比较所需要实现的接口。
Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的需求时,可以写一个比较器来完成两个对象之间大小的比较






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