黑马程序员技术交流社区

标题: TreeMap获取字母出现次数问题,帮看下注释的理解对不对 [打印本页]

作者: 209920266    时间: 2015-1-3 17:37
标题: TreeMap获取字母出现次数问题,帮看下注释的理解对不对
package cn.handan;

//
import java.util.TreeMap;

public class Demo12 {
        public static void main(String[] args) {
                String str = "abcdefsdeksdas";
                str = getCharCount(str);
                System.out.println(str);
        }

        public static String getCharCount(String str) {
                char[] chs = str.toCharArray();
                TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
                for (int i = 0; i < chs.length; i++) {
                        Integer value = tm.get(chs[i]);
                        /*遍历的字符第一次出现对应的都为null,通过tm.put(chs[i],1)
                         * 将键对应的值由null改为1(可以理解为此字符出现了一次)
                         * 当次字符第二次出现时,其有对应的值1.所以不为空,通过value++将值改为2,依次类推
                         * if(value==null){ tm.put(chs[i], 1); }else{ value++;
                         * tm.put(chs[i], value);
                         */
                        int count = 0; // 第一次出现的字符(键)对应值为空,通过count++将值改为1.
                        if (value != null) { // 第二次出现时对应的值为1,调用count=value;count++。将值改为2依次类推
                                count = value; //
                        }
                        count++;
                        tm.put(chs[i], count);

                }

                return tm.toString();
        }
}



作者: gzy    时间: 2015-1-3 17:37
和老毕说的一致,没错呀。求黑马币
作者: 小平    时间: 2015-1-3 19:00
map中建有重复
作者: yuanlingqi    时间: 2015-1-4 08:43
本帖最后由 yuanlingqi 于 2015-1-4 08:47 编辑

你的代码和理解没有问题。
利用map的非空判断机制,简单的计数,理解的没有问题,很好,你的这个写法,去除了多余的else,值得推荐。

QQ图片20150104084640.jpg (110.53 KB, 下载次数: 55)

QQ图片20150104084640.jpg

作者: pure_dust    时间: 2015-1-5 10:20
同样的键,有了不同的值,这样可能有影响吧
作者: Mr.JUN    时间: 2015-1-6 11:08
我觉得count有点多余,我觉得先遍历char[],再在if-else中调用containsKey(),get(Object key)
作者: Mr.JUN    时间: 2015-1-6 11:21
我的代码,可能不完善:
  1. import java.util.*;

  2. public class MapDemo {
  3.         public static void main(String[] args) {
  4.                 Scanner in = new Scanner(System.in);        //从键盘输入字符串
  5.                 String srcString = in.nextLine();        //读取源字符串

  6.                 String result = getCountChar(srcString);
  7.                 System.out.println(result);
  8.         }

  9.         //统计字符的次数
  10.         public static String getCountChar(String srcStr) {
  11.                 char[] chs = srcStr.toCharArray();
  12.                 Map<Character, Integer> map = new HashMap<Character, Integer>();

  13.                 for (int i=0; i<chs.length; i++) {
  14.                         if (map.containsKey(chs[i])) {
  15.                                 map.put(chs[i], map.get(chs[i])+1);        //已存在key-value,value+1再重新插入
  16.                         } else {
  17.                                 map.put(chs[i], 1);                //第一次插入key-value
  18.                         }
  19.                 }
  20.                
  21.                 return map.toString();
  22.         }
  23. }
复制代码

作者: 执笔画梦    时间: 2015-1-6 23:16
感觉好像有点道理
作者: zhengyk    时间: 2015-1-19 22:31
Mr.JUN 发表于 2015-1-6 11:21
我的代码,可能不完善:

HashMap与TreeMap的区别是TreeMap集合输出自带排序(默认自然排序)
作者: zhengyk    时间: 2015-1-19 22:33
  1. package com.study;

  2. import java.util.TreeMap;

  3. public class Test2 {
  4.         public static void main(String[] args) {
  5.                 String str = "aaabbccdeeerrr";
  6.                 str = getCharCount(str);
  7.                 System.out.println(str);
  8.         }

  9.         public static String getCharCount(String str) {
  10.                 char[] chs = str.toCharArray();
  11.                 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
  12.                 for (int i = 0; i < chs.length; i++) {
  13.                         Integer value = tm.get(chs[i]);

  14.                         value = value == null ? 0 : value;
  15.                        
  16.                         tm.put(chs[i], ++value);

  17.                 }

  18.                 return tm.toString();
  19.         }
  20. }
复制代码
优化版。我只是站在巨人的肩膀上。
作者: Itbelong    时间: 2015-1-23 22:47
没有问题啊
作者: lwj123    时间: 2015-2-5 20:10
  1. package lwj2;

  2. import java.util.Iterator;
  3. import java.util.Set;
  4. import java.util.TreeMap;

  5. /*
  6. * 需求:判读"askhdfashdfdvkloiweoibnxcvzfashdfk"字符串中每个字母出现的次数,并排序按照一下格式输出
  7. * a[3]d[3]f[4]...
  8. *
  9. * 分析:
  10. *         A:需要排序,所以我们采用TreeMap集合存储,并排序
  11. *         B:怎么存储并计算每个字符出现的次数的?
  12. *             a:定义TreeMap集合:TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
  13. *             b:定义count变量,来计算每个字符出现的次数
  14. *             c:将字符串转化为字符数组,遍历该数组,获取每一个字符,将该字符存进TreeMap集合中
  15. *                     使用get方法判断返回值:
  16. *                         如果返回值为null:表示集合里没有这个key,将该字符作为key,1作为value存进集合
  17. *                         如果返回值不为null:表示集合里已经有这个key,获取该key下的值,并将value++,并将该字符作为key,value++存进集合
  18. *             d:将该集合转化为指定输出格式的字符串
  19. *                     创建StringBuilder对象
  20. *                     遍历该集合
  21. *                     使用StringBuilder对象对集合数据进行拼接操作
  22. *                     
  23. *               a,2
  24. *               b,4
  25. *               f,5
  26. *               t,9
  27. *            
  28. *            
  29. *
  30. */
  31. public class TreeMapDemo {
  32.     public static void main(String[] args) {
  33.         // 指定需要操作的字符串
  34.         String s = "askhdfashdfdvkloiweoibnxcvzfashdfk";

  35.         // 定义TreeMap集合
  36.         TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

  37.         // 定义count变量,来计算每个字符出现的次数
  38.         int count = 0;

  39.         // 将字符串转化为字符数组
  40.         char chs[] = s.toCharArray();

  41.         // 遍历该数组,获取每一个字符,将该字符存进TreeMap集合中
  42.         for (char ch : chs) {
  43.             if (tm.get(ch) != null) {
  44.                 // 表示集合里已经有这个key,获取该key下的值,并将value++,并以ch和value++再次存入集合中
  45.                 Integer i = tm.get(ch);

  46.                 // 并将value++
  47.                 i++;
  48.                 // 并以ch和value++再次存入集合中
  49.                 tm.put(ch, i);
  50.             } else {
  51.                 // 表示该ch字符之前出现在集合中,将该值存进集合
  52.                 tm.put(ch, 1);
  53.             }
  54.         }
  55.         // 创建StringBuilder对象
  56.         StringBuilder sb = new StringBuilder();
  57.         sb.append("{");
  58.         // 遍历该集合
  59.         Set<Character> set = tm.keySet();
  60.         for (Iterator<Character> it = set.iterator(); it.hasNext();) {
  61.             Character ch = it.next();

  62.             Integer i = tm.get(ch);
  63.             sb.append(ch).append(" = ").append(i).append(",");
  64.         }
  65.         sb.append("}");
  66.         // for (Character ch : set) {
  67.         // Integer i = tm.get(ch);
  68.         // if (set.size() == 0) {
  69.         // sb.append(ch).append("[").append(i).append("]").append(",");
  70.         // }
  71.         // }

  72.         System.out.println(sb.toString());

  73.     }
  74. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2