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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付凯鹏 中级黑马   /  2013-11-29 16:26  /  2235 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*获取一个字符串中每个字符出现的次数。例如:"abkabklok"打印输出a(2)b(2)k(3)l(1)o(1)
*/
public class String_5{
        public static void main(String[] args){

                stringCount();
        }
        public static void stringCount(){
                String str="abkkajjuda";
                char[] ch=str.toCharArray();
                for(int i=0;i<str.length();i++){
                        int count=0;
                        int index=0;
                        while((index=str.indexOf(ch[i],index))!=-1){
                                index++;
                                count++;
                        }
                        System.out.print(ch[i]+"("+count+")");
                }
       }
}

我这种方法输出的结果有重复,该如何改善才能避免重复,前面字符a已经求出出现次数,后边那个字符a就不求了?在原有基础上加以改进。求各位大神们解决一下,一直没想出好的解决方法。多谢了。。

5 个回复

倒序浏览
本帖最后由 yangjie 于 2013-11-29 21:01 编辑

  1. class String_5{
  2.    
  3.      public static void main(String[] args){
  4.                 stringCount();
  5.      }

  6.     public static void stringCount(){
  7.             TreeMap<Character,Integer> treemap = new TreeMap<Character,Integer>();
  8.             String str ="aabcaadk76qoq";
  9.             for(int i=0;i<str.length();i++){
  10.                    char ch = str.charAt(i);
  11.                    if(('a'<= ch && ch <='z')||('A'<= ch && ch <='Z')){
  12.                           Integer n = treemap.put(ch,null);
  13.                           if(n == null){
  14.                                  treemap.put(ch,1);
  15.                           }else{
  16.                                  treemap.put(ch,++n);
  17.                           }
  18.                   }
  19.             }
  20.             System.out.println(treemap);//输出略过
  21.        }
  22. }   
复制代码
这个用到了集合

数组的:

  1. class String_5{
  2.         
  3.   public static void main(String[] args){
  4.           stringCount();
  5.   }
  6.   public static void stringCount(){
  7.           String str ="aabcaadk76qoq";
  8.           char[] chs=str.toCharArray();
  9.                for(int i=0;i<chs.length-1;i++){
  10.                    char ch = chs[i];
  11.                    int num = 1;
  12.                    if(('a'<= ch && ch <='z')||('A'<= ch && ch <='Z')){
  13.                          for(int j = i+1;j<chs.length;j++){
  14.                                 if(ch == chs[j]){
  15.                                  num ++;
  16.                                  chs[j] = ' ';//把计算过的字符替换掉
  17.                                  }
  18.                          }
  19.                         System.out.print(ch +"("+ num+")");
  20.                  }
  21.        }
  22.    }
  23. }
复制代码
我也有这道题,当时没做出来……

回复 使用道具 举报
哥要告诉你,这样是不完美的
请看哥的分析:
*                 1 根据Map键值不允许重复的特点,我样可以将字母和字母的个数以键值对的方式存入Map中,
* 由于这里并没有要求按指定规则排序,因此我们采用TreeMap的自然排序。
*                 2根据要求,只统计字母,因此我们采用在统计过程中只对字符编码在 65-90,97-122之间的
* 字符进行统计。
*
*
*                 步骤:
*                 1 定义要进行统计的字符串;
*                 2定义一个Map,用其键值对进行计数;
*                 3 将字符串转为字符数组进行遍历并存入Map;
*                 4打印输出
*
*
  1. public class Test1 {

  2.        
  3.         public static void main(String[] args) {
  4.                         //1 定义要进行统计的字符串;
  5.                 String s="abcdekka27qoq";
  6.                         //2定义一个Map,用其键值对进行计数;
  7.             TreeMap <Character, Integer> hm=  new TreeMap<Character,Integer>();
  8.           
  9.                     //3 将字符串转为字符数组进行遍历;
  10.             char []chs=s.toCharArray();
  11.                     //增强for;
  12.                  for(char c:chs){
  13.                          // 只统计字母,因此我们采用在统计过程中只对字符编码在 65-90,97-122之间的
  14.                         // 字符进行统计。
  15.                          if((65<=c&c<=90)||(97<=c&c<=122)){
  16.                                
  17.                                  //通过get()方不获取字母的值,如果值为null说明Map中没有这个字母,
  18.                                  //将字母做为键值存入 ,并将设其个数为1做为value值存入其中
  19.                                  if(hm.get(c)==null){
  20.                                
  21.                                          hm.put(c, 1);
  22.                                  }
  23.                                  //如果不为空说明其中有这个字母,将字个数加1后存入其中。
  24.                                  else{
  25.                                 hm.put(c,hm.get(c)+1);
  26.                         }
  27.                                
  28.                         }
  29.                          
  30.                  }
  31.                  // 获取 Map的键 集合,并 遍历Map ,此时Map中的键值对即为
  32.                  // 字母和个数。
  33.                 Set<Character > keys= hm.keySet();
  34.                  for(char key:keys ){
  35.                          // 4打印输出  根据需求格式输出。
  36.                          System.out.print( key+"("+ hm.get(key)+")");
  37.                          
  38.                  }
  39.                
  40.         }

  41. }
复制代码
回复 使用道具 举报
  1. package com.itheima;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Map.Entry;
  5. import java.util.Set;
  6. import java.util.TreeMap;

  7. public class Test4 {
  8.         public static void main(String[] args) {
  9.                 //定义字符串并初始化
  10.                 String s = new String("abcdekka27qoq");
  11.                
  12.                 //定义Map集合,我们用key存放元素,用value存放元素出现的次数,运用泛型限制添加元素的类型
  13.                 Map<Character,Integer> map = new TreeMap<Character,Integer>();
  14.                
  15.                 char[] ch = s.toCharArray();//将字符串转换为数组!
  16.                 System.out.println(ch);//打印出作为参照
  17.                
  18.                 //利用java5新特性增强型for循环,对这个数组进行迭代!
  19.                 for (char c : ch) {
  20.                         //取出数组中的元素后进行判断map集合中是否存在此元素,也就是说是否是第一次出现
  21.                         if(!map.containsKey(c)){
  22.                                 map.put(c, 1);//是第一次出现的话就把这个元素添加进来,并把value的值赋为1
  23.                         }else{//集合中存在,就是说不是第一次出现的话就把它的次数增加1。
  24.                                 Integer val = map.get(c);//取得它出现的次数。
  25.                                 val+=1;//将次数增加1
  26.                                 map.put(c, val);
  27.                         }
  28.                 }
  29.                
  30.                 //利用entrySet()方法将map集合转化为set集合,这样的话就可以使用Iterator接口进行迭代!
  31.                 Set<Entry<Character, Integer>>  set = map.entrySet();
  32.                
  33.                 Iterator<Entry<Character, Integer>> it = set.iterator();//利用方法iterator()返回Iterator对象
  34.                
  35.                 //进行遍历
  36.                 while(it.hasNext()){
  37.                         //利用泛型的好处:消除了强转的麻烦。next()方法返回了map的内部接口Entry
  38.                         Entry<Character, Integer> entry = it.next();
  39.                        
  40.                         //利用方法getKey()和getValue()完成输出!
  41.                         System.out.print(entry.getKey()+"("+entry.getValue()+")");
  42.                 }
  43.         }
  44. }
复制代码
回复 使用道具 举报
同学、问题已经解决了吗?
如果没有、就去新版28期问吧,26~27已经结束了。开班了!
http://bbs.itheima.com/forum-165-1.html
回复 使用道具 举报
yangjie 发表于 2013-11-29 20:41
这个用到了集合

数组的:

这个数组的做法不对啊,请楼主三思
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马