A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qmlovewhr 中级黑马   /  2013-7-9 00:18  /  1203 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 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();这个迭代器是怎么使用的?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
哥们,你还是反复看毕老师视频吧~
回复 使用道具 举报
第一个问题,是比较器,就是给集合加上一个比较的方法
因为你不同的集合,但是比较器相同,所以自然比较的方法就相同

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

你这程序也没报错?
回复 使用道具 举报
看错了,第二个问题,是以map.entry这个类作为set集合的泛型,儿这个类里面就是键值对
迭代器的用法
while(it.hasNext())
{
       it.next():
}
回复 使用道具 举报
用手机打的上面代码别复制,符号不对
回复 使用道具 举报
学习学习!
回复 使用道具 举报
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!
   

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马