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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ______雨点ペ 中级黑马   /  2014-10-19 20:47  /  1956 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ______雨点ペ 于 2014-10-21 16:48 编辑

取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,
    输出格式为:a(2)b(1)k(2)...

点评

视频中有详细的解释了,建议去好好看看  发表于 2014-10-19 21:34

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

14 个回复

倒序浏览
  1. package com.itheima;

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

  5. /*
  6. * 需求: 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,
  7. *          输出格式为:a(2)b(1)k(2)...
  8. */
  9. public class Test3 {
  10.         public static void main(String[] args) {
  11.                 String str = "abcdekka27qoq";

  12.                 // 定义Map集合,用于存储字符和个数的键值对
  13.                 Map<Character, Integer> treeMap = new TreeMap<Character, Integer>();

  14.                 int count = 0;// 表个数
  15.                 char[] chs = str.toCharArray();
  16.                 for (char ch : chs) {
  17.                         if (!treeMap.containsKey(ch)) {
  18.                                 // 如果Map集合的key里不存在这个字符,添加个数为1
  19.                                 treeMap.put(ch, 1);
  20.                         } else {
  21.                                 // 如果Map的key里存在这个字符,获得原来的个数再加1,然后添加
  22.                                 treeMap.put(ch, treeMap.get(ch) + 1);
  23.                         }
  24.                 }

  25.                 // 定义StringBuilder用于按照输出格式添加字符和个数
  26.                 StringBuilder sb = new StringBuilder();
  27.                
  28.                 Set<Character> keySet = treeMap.keySet();
  29.                 for (Character key : keySet) {
  30.                         sb.append(key + "(" + treeMap.get(key) + ")");
  31.                 }

  32.                 System.out.println(sb.toString());
  33.         }
  34. }
复制代码


刚敲的代码,希望帮到楼主

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
运用好排序。代码自己思考下就行了,很简单。
回复 使用道具 举报
本帖最后由 十万一千 于 2014-10-19 21:43 编辑

先前在论坛里看过一种思路:题目要求字母出现的次数,所有可以构建一个 new int['z' + 1];的数组来统计字母的频数。

复制代码
  1. package com.itheima.番外;

  2. public class 统计字符出现频数 {
  3.         // 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)
  4.         public static void main(String[] args) {
  5.                 int[] statisticsArray = new int['z' + 1];
  6.                 String string = "I Love Heima!";
  7.                 for (int i = 0; i < string.length(); i++) {
  8.                         char c = string.charAt(i);
  9.                         if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
  10.                                 statisticsArray[c]++;
  11.                         }
  12.                 }
  13.                 for (int i = 0; i < statisticsArray.length; i++) {
  14.                         int tmp = statisticsArray[i];
  15.                         if (tmp != 0) {
  16.                                 System.out.print((char) i + "(" + tmp + ")");
  17.                         }
  18.                 }
  19.         }
  20. }
复制代码


回复 使用道具 举报
  1. import java.util.*;
  2. /*
  3. *   取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,
  4. *   输出格式为:a(2)b(1)k(2)...
  5. * */
  6. public class Test
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 String strTest = "abcdekka27qoq";
  11.                 Map<Character, Integer> map = new TreeMap<Character, Integer>();
  12.                 int count = 0;
  13.                 for (char c : strTest.toCharArray())
  14.                 {
  15.                         if (map.containsKey(c))
  16.                         {
  17.                                 count = map.get(c);
  18.                                 map.put(c, ++count);
  19.                         }
  20.                         else
  21.                         {
  22.                                 map.put(c, 1);
  23.                         }
  24.                 }
  25.                 for (Map.Entry<Character, Integer> me : map.entrySet())
  26.                 {
  27.                         System.out.print(me.getKey() + "(" + me.getValue() + ")");
  28.                 }
  29.         }
  30. }
复制代码
回复 使用道具 举报
本帖最后由 ______雨点ペ 于 2014-10-21 16:36 编辑

我就看懂你这个答案了……比楼上的代码简洁……回来奖你糖吃
回复 使用道具 举报
想飞的鱼 发表于 2014-10-19 21:08
刚敲的代码,希望帮到楼主

你这是大大的帮助!!!回来我奖你糖吃……
回复 使用道具 举报
刚 写完这题,上边很多代码了,我 把思路给你贴一下算了
1、将字符串转换成字符数组,因为需要对每一个字符进行操作。
2、定义一个Map集合,因为需要对打印结果进行排序。所以定义TreeMap
3遍历字符数组
        将每个字母作为键去查Map集合
        如果返回值为null时 就将该字母存入map集合中。
        如果返回不为null,说明该字母已经存在,并有对应的次数。
        那么就将该值取出并且进行自增。然后将该字母的次数存入Map集合中,覆盖原来的键所对应的值。
4、将map集合中的数据变成指定的字符串形式。
回复 使用道具 举报
qq8921310 发表于 2014-10-21 16:25
刚 写完这题,上边很多代码了,我 把思路给你贴一下算了
1、将字符串转换成字符数组,因为需要对每一个字符 ...

我懂了……多谢哦……祝你好运……
回复 使用道具 举报
mudao 中级黑马 2014-10-21 20:34:00
10#
把字符串转换成数组,应该就成功一半了。
回复 使用道具 举报
以上都不正确,题目要求是输出字母出现的次数,而不是每个字符出现的次数。
我给你来个简单的。
  1. //求abcdekka27qoq中字母出现的次数
  2.         public static void main(String[] args) {
  3.                    String st = "abcdekka27qoq";
  4.                    char[] ch = st.toCharArray();
  5.                    int[] num = new int[122];
  6.                    for(int i =0;i<ch.length;i++){
  7.                            num[ch[i]]++;
  8.                    }
  9.                    for(int z= 65;z<num.length;z++){
  10.                            if(num[z]>0){
  11.                                    System.out.print((char)z+"("+num[z]+")");
  12.                            }
  13.                    }

  14.         }
复制代码
谁有我简便,请告诉我。。。


回复 使用道具 举报
ebide 中级黑马 2014-10-21 21:34:53
12#
视频看透再来问问题吧
回复 使用道具 举报
我发觉我只是为了增加人气的,没办法,我还没有看到这一部分
回复 使用道具 举报
  1. public class count_test {
  2.         public static void main(String[] args) {
  3.                 List<Character> letter=new ArrayList<Character>();
  4.                 String s="abbbcdekka27qoqAHHSSSTTT";
  5.                 int[] count=new int[52];
  6.                 for(int i=0;i<s.length();i++)
  7.                 {
  8.                     char c=(char)s.charAt(i);
  9.                         if(Character.isLetter(c))
  10.                         {
  11.                                 if(!letter.contains(c))
  12.                                 {
  13.                                         letter.add(c);
  14.                                         System.out.println(letter);
  15.                                 }
  16.                                 count[c-'A']+=1;
  17.                         }
  18.                 }
  19.                 for(int i=0;i<letter.size();i++)
  20.                 {
  21.                         System.out.print(letter.get(i)+"("+count[letter.get(i)-'A']+")");
  22.                 }
  23.         }
  24. }
复制代码
楼主,且听我说来
大多数人都是用map做的,我这个思路比较特殊,用于统计字母是非常方便的,当然如果要统计一个文档中的所有字符的话就必须用map了
大致思路是:
字母a的统一码是65吧,z是91,当我读取一个字母后他的值肯定是65-91之间对吧,那么我减去a,如果我读取的是a,减去a不就是0吗
array[0]就可以用来表示a出现的次数,后面的你应该明白了吧,我觉得这是一个很好的思路
当然,如果是统计一个txt文档中所有字符出现的次数,就必须用map了
希望能帮到你!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马