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

© 陈延真 中级黑马   /  2013-6-19 11:19  /  1766 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
* "cbxzbvavdvgd"获取字符串中,每一个字母出现次数:a(1)b(2)c(1)d(2)g(1)v(3)x(1)z(1)
*/


import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {
public static void main(String[] args) {
  // 定义一个字符串
  String str = "cbxzbvavdvgd";
  // 把字符串的数据存储到TreeMap中。
  TreeMap<Character, Integer> tm = stringToTreeMap(str);

   // 写一个功能,把TreeMap变成一个字符串返回。要求,Map的值用()括起来。
  String s = treeMapToString(tm);
  System.out.println("s:" + s);
}
/*
  * 功能:把字符串中的数据存储到TreeMap中。 明确: 返回值类型:TreeMap<Character,Integer> 参数列表:String
  */
public static TreeMap<Character, Integer> stringToTreeMap(String str) {
  TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
  // 把字符串变成字符数组
  char[] chs = str.toCharArray();
  // 遍历字符数组,获取每一个字符
  for (char ch : chs) {
   Integer i = tm.get(ch);
      tm.put(ch, i);
  }
  return tm;
}
/*
  * 把TreeMap变成一个字符串。 明确: 返回值类型:String 参数列表:TreeMap tm
  */
public static String treeMapToString(TreeMap<Character, Integer> tm) {
  StringBuilder sb = new StringBuilder();
  // 遍历TreeMap,获取键值,并拼接
  Set<Character> set = tm.keySet();
  for (Character key : set) {
   Integer value = tm.get(key);
   sb.append(key).append("(").append(value).append(")");
  }
  return sb.toString();
}
}

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

4 个回复

倒序浏览
/*
                  * 功能:把字符串中的数据存储到TreeMap中。 明确: 返回值类型:TreeMap<Character,Integer> 参数列表:String
                  */
                public static TreeMap<Character, Integer> stringToTreeMap(String str) {
                  TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
                  // 把字符串变成字符数组
                  char[] chs = str.toCharArray();
                  // 遍历字符数组,获取每一个字符
                  for (char ch : chs) {
                          //存在错误
                          Integer i = tm.get(ch);
                          if(i==null){
                                  i = 1;
                          }else{
                                  i += 1;
                          }
                      tm.put(ch, i);
                  }
                  return tm;
                }

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
  问题处在Integer身上,因为它默认是null,
  1. for (char ch : chs) {
  2.    Integer   i = tm.get(ch);
  3.      if(i==null){
  4.       tm.put(ch, 1);//在这里进行添加时手动写入一个1
  5.      }else{
  6.       i++;
  7.       tm.put(ch, i);
  8.      }     
  9.    }
复制代码
回复 使用道具 举报
  1. for (char ch : chs) {
  2.           if (tm.get(ch) == null)
  3.           {
  4.                   tm.put(ch,1);
  5.           }
  6.           else
  7.                   tm.put(ch,tm.get(ch)+1);
  8.      // Integer i = tm.get(ch);
  9.      // tm.put(ch, i);
  10.   }
复制代码
帮楼主更正了一下。

  for (char ch : chs) {
   Integer i = tm.get(ch);
      tm.put(ch, i);
  }如果按楼主的这种写法,那么tm调用get(ch)后,i为null,后面tm.put(ch,i),存入的值就为null,这样下次在判断到相同的字母时,获取到的值仍然是null。
所以,要先保证第一次出现后,把值该为1,后续出现再在原值上加1就可以实现计数了。
回复 使用道具 举报
楼主的思路挺清晰的,但是在计数的时候忽略了几点内容:
1  首先要判断该字符是否已存储过,如果没有,则将 i 置为 1;
2  如果不是第一次查到该字符,则需要将出现的数目加1,再进行查找;
而楼主的方法缺乏相关的判断,使得第一次统计次数时,次数均被赋为空值,之后也没有改变。
即需要做如下:
将 Integer i = tm.get(ch);
      tm.put(ch, i);

修改为:
if(i==null)
   {
       tm.put(ch, 1);
   }
   else
   {
           i = i+1;
           tm.put(ch, i);
   }

建议参考毕老师第16天的视频

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

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