黑马程序员技术交流社区

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

作者: 张吉日    时间: 2012-9-4 23:13
标题: TreeSet与他的比较器的问题
本帖最后由 张吉日 于 2012-9-5 13:51 编辑

  1. 我的问题是 Mycompare类的比较器,如果没有if判断年龄语句,就光判断名字的自然排序
  2. 加上if判断语句的话就在名字相同时 判断年龄的大小。
  3. 当TreeSet ts = new TreeSet(new MyCompare());接入比较器之后
  4. 里面具体是怎么实现的呢?
  5. 我的问题可能有点乱,希望大家帮忙解除疑惑...谢谢
  6. ------------------------------------------------------------
  7. import java.util.*;
  8. class Student implements Comparable
  9. {
  10.         private String name;
  11.         private int age;

  12.         Student(String name,int age)
  13.         {
  14.                 this.name = name;
  15.                 this.age = age;
  16.         }

  17.         public int compareTo(Object obj)
  18.         {

  19.                 //return 0;
  20.                
  21.                 if(!(obj instanceof Student))
  22.                         throw new RuntimeException("不是学生对象");
  23.                 Student s = (Student)obj;

  24.                 //System.out.println(this.name+"....compareto....."+s.name);
  25.                 if(this.age>s.age)
  26.                         return 1;
  27.                 if(this.age==s.age)
  28.                 {
  29.                         return this.name.compareTo(s.name);
  30.                 }
  31.                 return -1;
  32.                 /**/
  33.         }

  34.         public String getName()
  35.         {
  36.                 return name;

  37.         }
  38.         public int getAge()
  39.         {
  40.                 return age;
  41.         }
  42. }
  43. class TreeSetDemo2
  44. {
  45.         public static void main(String[] args)
  46.         {
  47.                 TreeSet ts = new TreeSet(new MyCompare());

  48.                 ts.add(new Student("lisi02",22));
  49.                 ts.add(new Student("lisi02",21));
  50.                 ts.add(new Student("lisi007",20));

  51.                 Iterator it = ts.iterator();
  52.                 while(it.hasNext())
  53.                 {
  54.                         Student stu = (Student)it.next();
  55.                         System.out.println(stu.getName()+"..."+stu.getAge());
  56.                 }
  57.         }
  58. }

  59. // MyCompare类的比较器*********************************
  60. class MyCompare implements Comparator
  61. {
  62.         public int compare(Object o1,Object o2)
  63.         {
  64.                 Student s1 = (Student)o1;
  65.                 Student s2 = (Student)o2;

  66.                 int num = s1.getName().compareTo(s2.getName());
  67.                 if(num==0)
  68.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));               
  69.                 return num;

  70.         }
  71. }
复制代码

作者: 杨习平    时间: 2012-9-4 23:56
|--Set 元素无序(存储顺序和取出顺序不一致),不可重复。
                |--HashSet
                        底层数据结构是哈希表。线程不安全。
                        如果保证元素的唯一性呢?
                        A:首先根据hashCode值判断。
                        B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
                         如果hashCode值相同,那么,会继续根据equals方法进行判断,
                         根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,储。

                        一般,用HashSet的时候,要重写hashCode和equals方法。
                        |--LinkedHashSet
                                底层数据结构是链表和哈希表。
                                链表用于保证元素有序,哈希表用于保证元素唯一。
                |--TreeSet
                        底层数据结构是二叉树,线程不安全。
                        如何保证元素的排序呢?两种方式
                        A:让元素本身具备比较性
                                实现Compareable接口中的compareTo方法。
                        B:让集合具备比较性
                                实现Comparator接口中的compare方法。
==================================
          equals(Object obj):比较对象的引用是否相同。
        hashCode():获取对象的哈希值。
        toString():对象的字符串描述

        为什么重写toString(),equals(),hashCode().
        为了打印对象名有意义。
        为了实现自己的比较方式。
        在Set和Map中为了保证自己需求的唯一。
作者: 郑世光    时间: 2012-9-5 07:15
当加入比较器后,就按照比较器的方法进行比较。原来的方法public int compareTo(Object obj)就不会运行了。
会运行比较器的方法:


       public int compare(Object o1,Object o2)

        {

              Student s1 = (Student)o1;

              Student s2 = (Student)o2;
               System.out.println(s1.getName()+"和"+s1.getName()+“比较”); //加入此代码你就可以清楚的看到具体的是怎么比较的
               int num = s1.getName().compareTo(s2.getName());

                if(num==0)

                       return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));               

                return num;


       }







作者: 张吉日    时间: 2012-9-5 13:51
郑世光 发表于 2012-9-5 07:15
当加入比较器后,就按照比较器的方法进行比较。原来的方法public int compareTo(Object obj)就不会运行了。 ...

谢谢   。




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