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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 杨兴庭 于 2013-7-9 21:17 编辑

import java.util.*;
class  MapTest3
{
public static void main(String[] args)
{
  charCount("aabfcdabcdfa");
}
public static String charCount(String str)
{
  char[]chs=str.toCharArray();
  TreeMap<Character,Integer>tm=new TreeMap<Character,Integer>();
  for(int x=0;x<chs.length;x++)
  {
   Integer value=tm.get(chs[x]);
   if(value==null)
   {
    tm.put(chs[x],1);
   }
   else
   {
    value=value+1;
    tm.put(chs[x],value);
   }
  }
  System.out.println(tm);
  return null;
}
}

在这段程序中,其中Integer value=tm.get(chs[x]);这句程序让我不解,我们拿先几次循环来说,当第一个字母a进入容器Set中,发现没有value为空,(a,1)就存入到容器中,接着第二个字母
还是a进来,这是value的值在之前变为1后,这次在不等于null的前提下,进行自增+1,变成2.那么就把(a,2)存入容器中,两次的存入就把之前的(a,1)给覆盖了,这样理解正解吗?另外,覆盖
到底是怎么进行的,它怎么知道我就要覆盖这两个数据?

评分

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

查看全部评分

4 个回复

倒序浏览
应该是根据key来覆盖的。key是唯一的,找到chs[x]这个key,然后把后面的value覆盖成新的
回复 使用道具 举报
嗯 是根据key来覆盖的,其实只覆盖了value,并没有两个都覆盖。看过Hashmap的实现是通过保存Entry数组来实现的,Entry中就有key和value,覆盖就是遍历这个Entry数组,如果遇到一个Entry对象中的key值和你put的key一样,就把原来的value返回来,把新的value存进去。还有就是判断一样的时候,它用了==和equals()两种判断方法。只要其一为真就属于相同的key了。为什么这样判断你懂的

评分

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

查看全部评分

回复 使用道具 举报
Integer value=tm.get(chs[x]); 在第一轮循环中x为0;chs[x] 为a,tm.get(chs[x]); 就相当于tm.get(‘a’); 返回值当然为null;因为这时tm中还没有a这个键。所以就把(a,1)存进去了。a和1的关系是:a为键,1位值,a 映射1,在TreeMap中键是不能重复的,而值是可以重复的。
第二轮循环中x为1,tm.get(chs[x]); 返回的value值不为空,因为第一轮已经存进去(a,1)了。所以就进入了else中。这时value+1为2了, tm.put(chs[x],value);这一句就相当于是 tm.put(a,2);  所以a不在映射1了,而是映射2,这是TreeMap集合中put方法的特点。可以查阅API文档。
{put(K key,  V value)将指定值与此映射中的指定键进行关联。如果该映射以前包含此键的映射关系,那么将替换旧值。 }
以此类推,最后的结果是{a=4, b=2, c=2, d=2, f=2}。
你的这个代码的含义其实就是在计算aabfcdabcdfa这个字符串中有几个a   几个b   几个c   几个d   几个f
运行结果告诉你 有4个a   ,  2个b,   2个c,   2个d,   2个f

评分

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

查看全部评分

回复 使用道具 举报
Integer value=tm.get(chs[x]);
这句话,是t通过get 方法拿chs[x]去  找对应的的值value ,因为你设的值为Integer 类型,开始你的TreeMap 集合是空的,所以返回的value 是空的。

你说的覆盖,当第一次存入的是(a,1),当第二次拿a 去获取值,得到value=1;然后自增,在存入 变成(a,2), 覆盖以前的(a,1)

它怎么知道要覆盖。是因为它去拿你的key,先去map集合 拿value ,如果value,不为空,就会覆盖的。


评分

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

查看全部评分

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