黑马程序员技术交流社区

标题: TreeMap集合遍历自定义对象一定要重写排序方法吗, [打印本页]

作者: yasyas001    时间: 2013-5-27 23:22
标题: TreeMap集合遍历自定义对象一定要重写排序方法吗,
本帖最后由 yasyas001 于 2013-5-28 22:47 编辑

有点迷糊
public int hashCode(){
    return this.name.hashCode()+this.age*17;
}
public boolean equals(Object obj){
  if (this ==obj) {
   return true;
  }
  if (!(this instanceof Student)){
   return false;
  }
  Student s = (Student) obj;
  return this.name.equals(s.name) && this.age == s.age;
}

作者: 王靖远    时间: 2013-5-27 23:31
有些可以自然排序。实际开发当然是根据需求自定义排序
作者: 廖志强    时间: 2013-5-27 23:50
同学,是HashMap为了保证为一性,必须写HashCode()和equals(),方法,而TreeMap是通过comparable和comparator接口来实现唯一性的。
通过comparator
public class TreeSetTest1 {
        public static void main(String[] args) {
                TreeSet<Student> tree = new TreeSet<Student>(new Comparator<Student>(){
                        @Override
                        public int compare(Student o1, Student o2) {
                                // TODO Auto-generated method stub
                                int num = o1.getName().length()-o2.getName().length();
                                int num2=(num==0)?(o1.getAge()-o2.getAge()):num;
                                int  num3=(num2==0)?o1.getName().compareTo(o2.getName()):num2;
                                return num3;
                        }
                });

作者: 廖志强    时间: 2013-5-27 23:53
还有一个是通过comparable
public class Person implements Comparable<Person>//注意实现接口。
@Override
        public int compareTo(Person p) {  //
               
作者: 石贤芝    时间: 2013-5-28 08:23
TreeMap是以二叉树的结构形式来存储对象的;二叉树是一种有序的数据结构,为了保证有序,使用TreeMap有两种方式。

第一种方式是所存储的键类要实现Comparable接口,覆盖compareTo() 方法,即覆写 hashCode() 和 equals() 方法;

第二种方式是自定义一个比较器类,让这个比较器类实现Comparator接口,在实例化TreeMap对象时,把一个实例化的比较器类对象作为参数传递给TreeMap的构造函数。
第二种方式更为灵活,耦合性较低,实际开发中此种方式使用得比较多。

作者: xiewen    时间: 2013-5-28 12:35
下面以自然排序为例

  1. import java.util.*;
  2. class R implements Comparable
  3. {
  4.         int count;
  5.         public R(int count)
  6.         {
  7.                 this.count = count;
  8.         }
  9.         public String toString()
  10.         {
  11.                 return "R[count:" + count + "]";
  12.         }
  13.         //根据count来判断两个对象是否相等。
  14.         public boolean equals(Object obj)
  15.         {
  16.                 if (this == obj)
  17.                         return true;
  18.                 if (obj!=null
  19.                         && obj.getClass()==R.class)
  20.                 {
  21.                         R r = (R)obj;
  22.                         return r.count == this.count;
  23.                 }
  24.                 return false;
  25.         }
  26.         //根据count属性值来判断两个对象的大小。
  27.         public int compareTo(Object obj)
  28.         {
  29.                 R r = (R)obj;
  30.                 return count > r.count ? 1 :
  31.                         count < r.count ? -1 : 0;
  32.         }
  33. }
  34. public class TreeMapTest
  35. {
  36.         public static void main(String[] args)
  37.         {
  38.                 TreeMap tm = new TreeMap();
  39.                 tm.put(new R(3) , "轻量级Java EE企业应用实战");
  40.                 tm.put(new R(-5) , "疯狂Java讲义");
  41.                 tm.put(new R(9) , "疯狂Android讲义");
  42.                 System.out.println(tm);
  43.                 //返回该TreeMap的第一个Entry对象
  44.                 System.out.println(tm.firstEntry());
  45.                 //返回该TreeMap的最后一个key值
  46.                 System.out.println(tm.lastKey());
  47.                 //返回该TreeMap的比new R(2)大的最小key值。
  48.                 System.out.println(tm.higherKey(new R(2)));
  49.                 //返回该TreeMap的比new R(2)小的最大的key-value对。
  50.                 System.out.println(tm.lowerEntry(new R(2)));
  51.                 //返回该TreeMap的子TreeMap
  52.                 System.out.println(tm.subMap(new R(-1) , new R(4)));
  53.         }
  54. }
复制代码
上面程序中定义了一个R类,该类重写了equals方法,并实现了Comparable接口,所以可以使用该R对象做为TreeMap的key,该key使用自然排序。
                                黑马云青年为您解答








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