黑马程序员技术交流社区

标题: TreeSet容器中 传递对象的问题 还有下面判断的方法 [打印本页]

作者: 刘茂林    时间: 2013-5-14 15:27
标题: TreeSet容器中 传递对象的问题 还有下面判断的方法
本帖最后由 刘茂林 于 2013-5-15 00:38 编辑
  1. mport java.util.*;

  2. /*
  3. * 需求: 按照字符串长度排序
  4. * 字符串本身具备比较性,但是不是所需要的,需要按照长度排序。
  5. * 这是就需要使用比较器
  6. *   
  7. * */
  8. public class TreeSetDemo2
  9. {
  10.     public static void sop(Object obj)
  11.     {
  12.         System.out.println(obj);
  13.     }

  14.     public static void main(String[] args)
  15.     {
  16.         TreeSet ts = new TreeSet(new StrLenComparator());
  17.         ts.add("aabc");
  18.         ts.add("asd");
  19.         ts.add("aaa");
  20.         ts.add("ddas");
  21.         ts.add("sd");
  22.         ts.add("sdfff");

  23.         Iterator it = ts.iterator();
  24.         while (it.hasNext())
  25.         {
  26.             sop(it.next());
  27.         }
  28.     }

  29. }

  30. class StrLenComparator implements Comparator
  31. {
  32.     public int compare(Object o1, Object o2)
  33.     {
  34.         String s1 = (String)o1;
  35.         String s2 = (String)o2;
  36.         
  37.         int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
  38.         if(num == 0)
  39.         {
  40.             return s1.compareTo(s2);
  41.         }
  42.         return num;
  43.         
  44.         /*if(s1.length() > s2.length())这里同样的如果用这种方式 长度相同的不同单词就没有添加进去
  45.             return 1;
  46.         if(s1.length() == s2.length())
  47.             return 0;
  48.         return -1;
  49.         */

  50.     }
  51. }
复制代码
int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); 这句有些不太懂

TreeSet ts = new TreeSet(new StrLenComparator());  这句也是 为什么传递了个对象
作者: 黑马伍哲沂    时间: 2013-5-14 15:57
本帖最后由 黑马伍哲沂 于 2013-5-14 15:59 编辑

int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
这句话的意思是Integer类里面有个  compareTo方法带一个参数,参数类型为Integer,用来比较两个Integer对象,s1.length()和s2.length()返回int。
所以要比较这两个数,需要把int先转化成Integer.转化的方法是Integer类有个构造函数,可以接受int类型数据。就像new String("abc"),是因为String类也有这个相应的构造函数。
Integer 类中的compareTo方法返回值为一个int类型。所以前面用int num来接收。

后面的不帮你分析了。你按我的说法去看看API.  你的问题是不会查看API,或者说对这些方法的参数还有返回值类型还没有概念。  感觉这个问题有点严重。  你要考虑踏实的看看更基础部分的视频了。
其实,看了几次再回去看  也许也还是会有收获的。别小看前面的视频。

作者: xuemeng    时间: 2013-5-14 17:47
本帖最后由 xuemeng 于 2013-5-14 21:37 编辑

楼上的回答的很好!!
  后面的我补充上, 首先我们知道要给TreeSet添加元素, 必须满足两个条件中的任何一个:
   1, 是让元素所属类实现Comparable接口, 让元素具有可比性!!!
    2, 就是让TreeSet具备比较器, 那么它添加的元素会按照比较器的定义的规则进行排序,  那么TreeSet怎么具备比较器呢?   TreeSet类提供了一个有参构造器                                       
  new TreeSet(Comparator comparator),  该构造器中的参数接受的是比较器, 也就是说, 使用该构造器创建对象, 那么创建出来的TreeSet集合对象就具有比较器,   又因为Comparator是一个接口, 所以我们无法创建对象,而这里的参数又必须是Comparator类型的, 那么怎么办了? 我们就只好传递它的实现类对象, 这也是为什么你的代码中要实现 Comparator接口的原因 ,但是如果你仅仅只是实现了Comparator接口,  但是你的TreeSet用的构造器如果不是new TreeSet(Comparator comparator) 这个构造器, 那么你创建出来的TreeSet对象就不具备比较器啊, 不具备比较器那你添加的元素就没法按照你定义的规则进行排序啊!!  
   

作者: 赵崇友    时间: 2013-5-14 19:38
是这样的:
1、TreeSet ts = new TreeSet(new StrLenComparator());这句话是说创建了一个TreeSet集合用来存放Object对象,而这个集合是按照StrLenComparator这个比较器来进行排序的。如果不传入这个对象的话,这个集合就使用默认的比较器了,你也说了,这不是所需要的。这才自定义了个比较器。
2、int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); 这句是比较两个字符串的长度,因为Integer已经实现了Comparator接口,所以这里可以是借用Integer中的方法compareTo,用来比较两个整型数的大小。如果看不懂的话,可以用下面这个代码代替。这里只是为了简化书写。
建议:楼主看视频的时候,不懂的可以多看几次,如果用到前面的知识点,可以回头复习,不要追求速度,因为你即使两天看完了,发现都不懂,还要重新回头看,那样更费时间。细节东西不必要深究,知道是什么意思就ok了,主要还是思想和逻辑。比如:这里为什么要使用自定义比较器。如果你想明白了,也就知道为什么要在这里给TreeSet传入这个比较器对象了。
个人见解,希望对你有帮助,欢迎交流。。
{:soso_e181:}
作者: 刘茂林    时间: 2013-5-15 00:38
谢谢 弄明白了




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