黑马程序员技术交流社区

标题: 有疑问的一段程序 [打印本页]

作者: qmlovewhr    时间: 2013-7-9 00:18
标题: 有疑问的一段程序
本帖最后由 杨兴庭 于 2013-7-9 21:15 编辑

import java.util.*;
class StuNameComparator implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
  int num=s1.getName().compareTo(s2.getName());
  if(num==0)
   return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  return num;
}
}
class MapTest2
{
public static void main(String[] args)
{
  TreeMap<Student,String>tm=new TreeMap<Student,String>(new StuNameComparator());
  tm.put(new Student("blisi3",23),"nanjing");
  tm.put(new Student("lisil",21),"beijing");
  tm.put(new Student("alisi4",24),"wuhan");
  tm.put(new Student("lisi2",22),"shanghai");
  Set<Map.Entry<Student,String>>entrySet=tm.entrySet();
  Iterator<Map.Entry<Student,String>>it=entrySet.iterator();
  while(it.hasNext())
  {
   Map.Entry<Student,String>me=it.next();
   Student stu=me.getKey();
   String addr=me.getValue();
   System.out.println(stu+":::"+addr);
  }
}
}
对于这段代码,我有些地方不是太明白,希望跟大家讨论下,解开我的困惑,其中TreeMap和HashMap有什么区别吗,为什么在TreeMap<Student,String>tm=new TreeMap<Student,String>(new StuNameComparator());和TreeMap<Student,String>tm=new TreeMap<Student,String>(new StuNameComparator());这两条语句之后,可以用相同的方法对Student中的数据进行处理,另外Set<Map.Entry<Student,String>>entrySet=tm.entrySet();这句代码如何理解,Iterator<Map.Entry<Student,String>>it=entrySet.iterator();这个迭代器是怎么使用的?

作者: 方珂    时间: 2013-7-9 00:24
哥们,你还是反复看毕老师视频吧~
作者: 张承富    时间: 2013-7-9 01:25
第一个问题,是比较器,就是给集合加上一个比较的方法
因为你不同的集合,但是比较器相同,所以自然比较的方法就相同

第二个问题,不知道,第一次见set集合泛型里面用键值对的

你这程序也没报错?
作者: 张承富    时间: 2013-7-9 01:29
看错了,第二个问题,是以map.entry这个类作为set集合的泛型,儿这个类里面就是键值对
迭代器的用法
while(it.hasNext())
{
       it.next():
}
作者: 张承富    时间: 2013-7-9 01:30
用手机打的上面代码别复制,符号不对
作者: 斗胆潇洒    时间: 2013-7-9 10:21
1、HashMap和TreeMap区别:
   HashMap底层哈希表,存储元素无序。
   TreeMap底层二叉树。有序,二叉树结构支持的,元素的存储子树,左小右大(默认)。
2、什么两句之后,可以用相同的方法对Student中的数据进行处理,没看懂 ——!,
   其实你只要知道,TreeMap键值元素会进行排序,则要求Student自定义类要具有比较性,
   无比较性怎么排?所以,Student要么让其实现Compareble接口,复写compareTo方法,
   让其自身带比较性。
   要么定义一个比较器,复写compare方法。使Student引用类型具有可比性。
   两者同时存在,以比较器为主。
3、其实你先将存映射关系的Map.Entry<Student,String>看做一个整体类型(如看做X),
   而entrySet()返回该X类型的一个Set集合,Set声明时<泛型>保持统一也为X,
   不就是Set<X> entrySet = tm.entrySet()吗。
   接着就是Set迭代器Iterator的遍历使用了,这个会吧^o^
   Iterator<X> it = entrySet.iterator();
   while(it.hasNext())
  {
           X me=it.next();
           ......
  }
4、而me.getKey();和me.getValue();都是X(即Map.Entry<Student,String>)的获取键和值的方法了。
   键为Student类型,自然要用Student接收,其实Map貌似存的就是一个一个的Entry<Student,String>,
   就是这个内部接口Map.Entry敲起来,长了点......
   
呵呵,学习中...交流共勉之,利人利己,Fighting!
   





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