黑马程序员技术交流社区
标题:
有疑问的一段程序
[打印本页]
作者:
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