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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© trj1123131766 中级黑马   /  2015-8-6 23:37  /  387 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

7 个回复

倒序浏览
你可以用String的indexof获取每个字符串的第一个出现的位置,然后将剩余的字符串切割出来再查找,再来个计数累加,不知道说的对不对,大神勿喷
回复 使用道具 举报
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Test1 {
        public static  void main(String[] args){
         String str = "abcdekka27qoq";
         String char_count = getCharCount(str);
         System.out.println(char_count);
        }
    public static String getCharCount(String str) {
                char[] chs = str.toCharArray();      //将字符串转成字符数组
                Map<Character,Integer> map = new TreeMap<Character,Integer>();  //定义map集合
                for (int i = 0; i < chs.length; i++) {   //遍历字符数组,获取每一个字母
                     if(!(chs[i] >= 'a' && chs[i] <= 'z')){   //过滤掉非字母字符
                       if(!(chs[i] >= 'A' && chs[i] <= 'Z')){
                                continue;
                            }
                        }
                        Integer value = map.get(chs[i]);    //将遍历到的字母作为键去查表,获取值
                        int count = 0;     //用于记录次数
                        if(value != null){   //判断次数是否存在
                                count = value;     //存在,就用count记录次数
                        }
                        count++;           //次数不存在,就不记录,只对count自增变成1
                        map.put(chs[i], count);   //将字符和次数进行存储
                }
                return toString(map);
        }
    public static String toString(Map<Character, Integer> map) {
              StringBuilder sb = new StringBuilder();   //使用缓冲区
              Set<Character> keySet = map.keySet();     //将map集合转变成set集合
              for (Iterator<Character> it = keySet.iterator(); it.hasNext();) {   //通过迭代器,取出map集合中的元素
                        Character key = it.next();
                        Integer value = map.get(key);
                        sb.append(key+"("+value+")");   
                }
                return sb.toString();
        }
}
回复 使用道具 举报
我的思路是:遍历字符串中每一个字符,将字符放到一种容器里面以便统计。
  1. String s = "cbxzbvavdvgd";
  2.                 Map<Character, Integer> map = new HashMap<Character, Integer>();
  3.                 Character c = null;
  4.                 for (int i = 0; i < s.length(); i++) {
  5.                         c = s.charAt(i);
  6.                         if (map.get(c) == null) { //第一次遇到这个字符
  7.                                 map.put(c, 1);
  8.                         } else { //多次遇到这个字符,累计之
  9.                                 map.put(c, map.get(c) + 1);
  10.                         }
  11.                 }
  12.                 // 最后遍历map,输出结果
  13.                 for (Character ch : map.keySet()) {
  14.                         System.out.print(ch+"("+map.get(ch)+")");
  15.                 }
复制代码
回复 使用道具 举报
当然是用TreeMap集合了
回复 使用道具 举报
   啊,原来还有TreeMap这么神奇的容器,TreeMap还带自动排序功效,感谢楼主此题以及各位学长的指点,我仍需努力。。
回复 使用道具 举报
map经典题   老毕视频里面有   必须会
回复 使用道具 举报
  1. package com.itheima;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.util.Arrays;

  6. /**
  7. * 1、 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...
  8. * ****************************************************************************************
  9. *--注:在本题中,考虑到字母大小写。
  10. *
  11. *思路:
  12. *1.通过字符缓冲流对象BufferedReader的readLine()方法获取输入并需要判断的一行字符串。
  13. *2.定义一个新的字符串,判断这个输入的字符串中包含字母的个数。并把其中是字母的字符存入新的字符串中。
  14. *3.定义一个二维字符数组:其中第一行代表字符,第二行代表这个字符出现的次数。遍历这个新的字符串,
  15. *   把字符出现的次数进行累加。
  16. *4.对这个数组结果进行统计并输出。使用StringBuilder输出。(如果第二行(出现次数)不为0,则输出)
  17. */
  18. public class Test_1 {
  19.         public static void main(String[] args) {
  20.                
  21.                 //①步骤一:1.通过字符缓冲流对象BufferedReader的readLine()方法获取需要判断的一行字符串。

  22.                 //提示用户输入字符串。
  23.                 System.out.println("请输入需要判断的字符串:");
  24.                 //定义需要判断的字符串
  25.                 String str = null;
  26.                 //定义字符读取工具:br
  27.                 BufferedReader br = null;
  28.                 try {
  29.                         //创建字符缓冲流对象
  30.                         br = new BufferedReader(new InputStreamReader(System.in));
  31.                         //通过字符缓冲流对象的readLine()方法读取一行字符输入,并赋值给str。
  32.                         str = br.readLine();
  33.                 } catch (IOException e) {
  34.                         new RuntimeException("字符串获取失败!");
  35.                 } finally {
  36.                         try {
  37.                                 br.close();//关闭资源
  38.                         } catch (Exception e2) {
  39.                                 new RuntimeException("字符串读取资源:br 关闭失败!");
  40.                         }
  41.                 }
  42.                
  43.                
  44.                 //②步骤二:2.定义一个新的字符串,判断这个输入的字符串中包含字母的个数。并把其中是字母的字符存入新的字符串中。
  45.                 //定义新的字符串
  46.                 String newStr = null;
  47.                 //定义一个零时的StringBuilder对象,用于缓存新的字符串。
  48.                 StringBuilder sb = new StringBuilder();
  49.                 //遍历输入的字符串中的每一个字符。
  50.                 for (int i = 0; i < str.length(); i++) {
  51.                         //取出字符串中的每个字符
  52.                         char ch = str.charAt(i);
  53.                         //判断字符是否是字母
  54.                         if((ch>=65&&ch<=90)||(ch>=97&&ch<=122)){
  55.                                 //如果是字母,则将其添加到sb中。
  56.                                 sb.append(ch);
  57.                         }
  58.                 }
  59.                 //将sb的字符串形式赋值给newStr
  60.                 newStr = sb.toString();
  61.                
  62.                
  63.                 //③步骤三:3.定义一个二维字符数组:其中第一行代表字符,第二行代表这个字符出现的次数。遍历这个新的字符串newStr,
  64.             //   把字符出现的次数进行累加。
  65.                 //定义包含所有字母的二维数组,第一行代表字符,第二行代表出现的次数
  66.                 char[][] chars = new char[][] { {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'},{'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'} };
  67.                
  68.                 //遍历这个新的字符
  69.                 for (int m = 0; m < newStr.length(); m++) {
  70.                         //获取新字符串中的每个字符
  71.                         char ch = newStr.charAt(m);
  72.                         for (int i = 0; i < chars[0].length; i++) {//循环遍历二维数组中第一行每一个字符与ch是否相等。
  73.                                 if(ch==chars[0][i]){//如果相等
  74.                                         chars[1][i] +=1;//则在二维数组的第二行进行累加1操作.
  75.                                 }
  76.                         }
  77.                 }
  78.                
  79.                 //④步骤四:4.对这个数组结果进行统计并输出。使用StrinBuilder输出。(如果第二行代表出现次数不为0,则输出)
  80.                 //定义输出的字符缓存。
  81.                 StringBuilder outSb = new StringBuilder();
  82.                
  83.                 for (int i = 0; i < chars[1].length; i++) {//循环遍历这个数组的第二行(出现次数)
  84.                         if(chars[1][i]!='0'){//如果次数不为0
  85.                                 outSb.append(chars[0][i]+"("+chars[1][i]+")");//则进行字符串拼接。
  86.                         }
  87.                 }
  88.                 System.out.println("输入结果为:");
  89.                 //输出这个组合的字符串。
  90.                 System.out.println(outSb.toString());
  91.         }
  92. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马