A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹善波 中级黑马   /  2012-7-24 01:26  /  2093 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//简单的字母排列
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又有什么联系

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 大半夜还在学习,辛苦了,早点休息,养足精.

查看全部评分

6 个回复

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

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

回复 使用道具 举报
这是我画的,看起来好小啊,也不知道发过去怎么样

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

图解.jpg

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 很给力!

查看全部评分

回复 使用道具 举报
晕死,上传不了图片么????
回复 使用道具 举报
先说下TreeSet的特点吧,由于TreeSet的底层数据结构是二叉树,所以,它里面装的元素一定是有序的,也就是说,里面存储的元素一定要有比较性。而java提供的例如String,Integer……这些类,自身都具有比较性,所以存入里面都会按照顺序排列。

那么,如果想存储自定义的对象呢?在自定义的对象没有比较性的情况下,只能存一个,不能存第二个,也就是说,当TreeSet中只有一个元素的时候,是不需要比较的。
所以,想要存自定义的对象的时候,就一定要保证该类的对象都具有比较性,那么如何实现呢?实现Comparable,并覆盖其中的compareTo方法,在其中写入你自定义的比较方式,大小排序,相等则不排,也就是说,实现Comparable去保证自己比较性的类,去判断元素大小,以及元素是否相同的依据是compareTo,与equals无关
而很多时候,或许你存的对象是别人写的类,也就是说,你不知道这个类会不会有比较性,并且,就算有比较性,会不会是你想要的那种排序方式,这时候,我们可以自定义一个比较器,也就是实现Comparator
通过实现Comparator,去覆盖其中的compare方法,就能得到我们想要的比较方式,再将此比较器传入TreeSet的构造中,就可以使用了,同理,如果使用自定义比较器,那么,判断对象是否相同,以及它们的大小关系仅仅只依据Comparator方法,也与equals无关
C:\Users\Administrator\Desktop\图解.jpg
至于比较的先后顺序,我草草画个图吧
回复 使用道具 举报
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
第一个与null比较,所以他留下;
第二个由于第一个比较,这两个又确定一个顺序(长度小的在前)
第三个进来又继续和前两个比较,重新按照长度改变顺序;-----以此类推比完所有。
当长度相同时,又调用默认的compareTo方法进行自然排序。
憋死我了,表达不出来了......
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马