黑马程序员技术交流社区

标题: Map子类TreeMap问题 [打印本页]

作者: 胡志翔    时间: 2013-10-28 00:30
标题: Map子类TreeMap问题
Set集合的TreeSet中的元素如果不具备比较性,要让元素实现Comparable接口,并且实现compareTo()方法,或则让TreeSet集合本身具备一个比较器,即编写一个比较器,实现Comparator接口,并实现其方法compare()方法,将比较器作为参数传递给集合,那么Map集合中的TreeMap中的也要这样做吗?
HashMap中存入的元素本身也要去覆盖equals()方法和hashCode()方法去保证唯一性吗?
作者: wenbaoxing    时间: 2013-10-28 08:06
是的,map集合中存的是键和值,键是一个set集合,可以对这个set集合进行指定顺序的排序。这有个示例:
  1. package cn.itcast.day1;

  2. import java.util.Comparator;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. import java.util.TreeMap;

  6. class StuNameComparator implements Comparator<Student> {
  7.         /* 按照姓名排序,如果姓名相同,那么按照年龄排序 */
  8.         public int compare(Student o1, Student o2) {
  9.                 int num = o1.getName().compareTo(o2.getName());
  10.                 if (num == 0) {
  11.                         return o1.getAge() - o2.getAge();
  12.                 }
  13.                 return num;
  14.         }

  15. }

  16. class Student /* implements Comparable<Student> */{// 十七具有比较性,防止排序的出现异常
  17.         private String name;// 姓名
  18.         private int age;// 年龄

  19.         public Student(String name, int age) {
  20.                 super();
  21.                 this.name = name;
  22.                 this.age = age;
  23.         }

  24.         public String getName() {
  25.                 return name;
  26.         }

  27.         public int getAge() {
  28.                 return age;
  29.         }

  30.         /*
  31.         // 重写hashCode()方法
  32.         public int hashCode() {
  33.                 return this.name.hashCode() + this.age * 12;
  34.         }

  35.          //重写equals方法
  36.         public boolean equals(Object ob) {
  37.                 if (!(ob instanceof Student))
  38.                         throw new ClassCastException("不是Student对象");
  39.                 Student stu = (Student) ob;
  40.                 return this.name.equals(stu.getName()) && this.age == stu.getAge();

  41.         }

  42.        
  43.         // 覆写CompareTo方法 先比较年龄,然后比较姓名
  44.          
  45.         public int compareTo(Student stu) {
  46.                 int num = this.age - stu.age;
  47.                 if (num == 0) {
  48.                         return this.name.compareTo(stu.name);
  49.                 }
  50.                 return num;

  51.         }
  52.         */

  53. }

  54. public class TreeMapDemo {
  55.         public static void main(String[] args) {
  56.                 /* 定义HashMap,里面存储的是Student和地址 */
  57.                 TreeMap<Student, String> map = new TreeMap<Student, String>(
  58.                                 new StuNameComparator());
  59.                 map.put(new Student("java03", 23), "北京");
  60.                 map.put(new Student("net02", 21), "上海");
  61.                 map.put(new Student("net02", 26), "厦门");
  62.                 map.put(new Student("net03", 26), "广州");
  63.                 map.put(new Student("java01", 24), "南京");
  64.                 map.put(new Student("java01", 22), "天津");
  65.                 map.put(new Student("net03", 26), "广州");

  66.                 Set<Student> set = map.keySet();
  67.                 Iterator<Student> it = set.iterator();
  68.                 while (it.hasNext()) {
  69.                         Student stu = it.next();
  70.                         String name = stu.getName();
  71.                         int age = stu.getAge();
  72.                         String address = map.get(stu);
  73.                         System.out.println(name + ":" + age + ":" + address);
  74.                 }

  75.         }

  76. }
复制代码

作者: 雨过丶天已晴    时间: 2013-10-28 10:11
本帖最后由 雨过丶天已晴 于 2013-10-29 13:30 编辑

其实可以通过查看TreeMap的帮助文档来回答第一个问题,文档中有四个构造方法,
第一个:通过空参数构造,目的是自然排序,那计算机到底怎么自然排序呢,肯定是实现Comparable接口
第二个:需要传入一个实现Comparator接口的参数,根据指定比较器排序
所以第一个答案是肯定的

对于第二问,我觉得要明确两个问题
1、把Map中的key是不能重复的,把Map中key全部集中起来,就组成了一个Set集合
2、其实Map集合,本质上是一个关联数组,换个简单的角度理解Map中key与value的关系,可以看做value是key的附属物,
因此,楼主的第二问,就迎刃而解了,key是关键所在,而key又不能重复,所以HashMap中的元素的Key是需要去重写equals(),hashCode(),保证唯一性的。
所以两个答案都是肯定的。

前面发了一次这个帖子,自己搞错了,希望楼主见谅,以前以为Map的底层是Set维护,可是昨天看源码才发现,Set集合是靠Map维护的,特来改正。
希望对楼主有所帮助,错误之处,大家多多指正


作者: To    时间: 2013-10-29 21:28
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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