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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑义 中级黑马   /  2012-9-2 14:00  /  1495 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑义 于 2012-9-2 19:40 编辑
  1. import java.util.*;
  2. class Demo
  3. {
  4. public static void main(String[] args)
  5. {
  6. Test t=new Test();
  7. t.setStr("abca");
  8. t.print();
  9. }
  10. }

  11. class Test
  12. {
  13. String str;
  14. public void setStr (String str)
  15. {
  16. this.str=str;
  17. }
  18. public void print ()
  19. {
  20. int cou = 0;
  21. char[] ch=str.toCharArray();
  22. TreeMap<Character,Integer> hm = new TreeMap<Character,Integer>(new Mycom());//加比较器

  23. for (int x=0;x<ch.length ;x++ )
  24. {
  25. Integer a=hm.get(ch[x]);
  26. if(a != null)
  27. cou = a;
  28. System.out.println("获取到"+ch[x]+"的值是"+a);
  29. cou++;
  30. System.out.println("下面要存入的键值对"+ch[x]+"......"+cou);
  31. hm.put(ch[x],cou);
  32. cou = 0;
  33. }
  34. System.out.println(hm);
  35. }
  36. }

  37. class Mycom implements Comparator<Character>
  38. {
  39. public int compare (Character s1,Character s2)
  40. {
  41. System.out.println(s1+"与"+s2+"比较:");
  42. int a=s1.compareTo(s2);
  43. return a;
  44. }
  45. }
复制代码
以上程序是获取一个字符串中各个字母的个数。
其结果打印出来是这样的:

通过上边的注释,发现一个问题
那就是在我存入b......1这个键值对之前就有“b与a比较”的这个过程。
请问为什么有b与a比较呢?系统怎么知道我将要存入b,为什么不是c。这个问题好纠结啊,求帮忙。

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
你要知道比较器不是只有添加的时候调用,当你从里面取值的时候也会调用的,原因就在你代码的27行
hm.get(ch[x]);
当第二次循环执行到这儿的时候,其实,hm里只有一个值就是{a,1},而且x=1;但是你hm.get(ch[x]);是,其实就是hm.get(b)
你要从map里取出key为b的值,总要调用比较器比较一下,里面是否有b,有的话才会给你返回值啊
回复 使用道具 举报
我好像明白这个问题了,你看API文档中这样解释get方法:
返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。
更确切地讲,如果此映射包含从键 k 到值 v 的映射关系,根据该映射的排序 key 比较起来等于 k,那么此方法将返回 v;否则返回 null。(最多只能有一个这样的映射关系。)

你理解错了,其实这时候b还没有存入TreeMap集合中呢。这点你可以在存入b的键值对关系之前加上System.out.println(hm);来验证
之所以会出现b跟a比较,是因为hm.get(ch[x]);传给get方法的键是ch[x],也就是b,所以,jvm就会拿b跟TreeMap集合中已经存在的键进行比较,这是就会调用比较器,所以会出现b和a比较,就像查找方法一样,你给他一个key,然后将key跟每一个数据进行比较,明白了吗?并不是说已经在TreeMap中了。
回复 使用道具 举报
陈莹 发表于 2012-9-2 15:18
我好像明白这个问题了,你看API文档中这样解释get方法:
返回指定键所映射的值,如果对于该键而言,此映射 ...


明白了,谢谢噢!
回复 使用道具 举报
该问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马