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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘乃宽 中级黑马   /  2013-7-27 21:05  /  2035 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-7-28 09:20 编辑

public class Test06 {

         /*
                    *取出一个字符串中字母出现的次数。如:"abcdekka27qoq"  a(2)b(1)k(2)...
         */
         
         public static void main(String[] args) {
                 count("abcdekka27qoq");
         }

         public static void count(String string) {
                 String s1 = "";
                 
                 char[] arr = string.toCharArray();
                 int i = 1;
                 
                 for (char c : arr) {
                         if (Character.isLetter(c)){
                                 i = countTime(c, arr.toString());
                                 
                                 s1 = s1 + c+"("+ i +")";
                                 System.out.println(s1);
                         }
                 }
                 
         }

         private static int countTime(char key, String string) {
                 char[] arr = string.toCharArray();
                 int times = 0;
                 for (int i = 0; i < arr.length; i++ ) {
                         if (arr== key){
                                 times++;
                         }
                 }
                 return times;
         }

}

思路是对的吗?哪儿些地方错了?

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

7 个回复

倒序浏览
基础测试的题目?
回复 使用道具 举报
不是基础测试
回复 使用道具 举报
哥们思路确实有点问题,不过也有亮点
我借鉴了下你的思路,想了个新方法
定义一个具有26个元素的整型数组
分别存放a-z出现的次数
如果字母出现的次数,不为0,就打印出来
代码如下
  1. package qbb;

  2. public class Test06 {
  3.         /*
  4.          *取出一个字符串中字母出现的次数。如:"abcdekka27qoq"  a(2)b(1)k(2)...
  5.          */
  6.         public static void main(String[] args) {
  7.                 count("abcdekka27qoq");
  8.         }
  9.         public static void count(String string) {
  10.                 String s1 = "";
  11.                 int[] array = new int[26];
  12.                 char[] arr = string.toCharArray();
  13.                 for (char c : arr) {
  14.                         if (Character.isLetter(c)){
  15.                                 array[c - 97]++;
  16.                         }
  17.                 }
  18.                 show(array);
  19.         }
  20.         private static void show(int[] array) {
  21.                 for(int i = 0; i < array.length; i++) {
  22.                         if(array[i] != 0) {
  23.                                 char c = (char)(97 + i);
  24.                                 System.out.println(c + "\t" + array[i]);
  25.                         }
  26.                 }
  27.                
  28.         }
  29. }
复制代码
运行结果:
a        2
b        1
c        1
d        1
e        1
k        2
o        1
q        2

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
本帖最后由 Mr_Free 于 2013-7-28 01:09 编辑

按照你的思路,我帮你写了一个,主要是我发现你这样的话 s加到后面如果出现重复的字母,你会再做调用一边字母统计,再加一边重复字母,为了避免这样的问题,我把你要存放的字母放在一个HashSet里面。HashSet有元素不可重复的特性,我重写一下equals方法,比较s1里面的字母是否一样来去除重复。虽然可能这个方法不是很好,希望对你有帮助哈。
  1. package cn.itcast.day3;

  2. import java.util.HashSet;
  3. import java.util.Iterator;


  4. public class newproblem1 {

  5.     /*
  6.                *取出一个字符串中字母出现的次数。如:"abcdekka27qoq"  a(2)b(1)k(2)...
  7.     */
  8.    
  9.     public static void main(String[] args) {
  10.             count("abcdekka27qoq");
  11.     }

  12.     public static void count(String s1) {
  13.             String ss = "";
  14.             
  15.             char[] arr = s1.toCharArray();
  16.             
  17.       
  18.             HashSet<S1> hs1 = new HashSet<S1>();
  19.             for (char c : arr) {
  20.                     if (Character.isLetter(c)){
  21.                                 if(hs1.add(new S1(c,1))){
  22.                                 int        i = countTime(c, s1);
  23.                                         Iterator<S1> it= hs1.iterator();
  24.                                         S1 s=(S1)it.next();
  25.                            
  26.                                         s.setI(i);
  27.                                         ss = ss + c+"("+ i +")";
  28.                             }
  29.                         }
  30.                        
  31.                     
  32.             }

  33.             System.out.println(ss);
  34.             
  35.     }

  36.    
  37.     private static int countTime(char key, String s1) {
  38.                     
  39.             char[] arr = s1.toCharArray();
  40.             int times = 0;
  41.             for (int i = 0; i < arr.length; i++ ) {
  42.                     if (arr[i]== key){
  43.                             times++;
  44.                     }
  45.             }
  46.             return times;
  47.     }
  48.   
  49. }
  50. class S1{
  51.         
  52.         private char c;
  53.         private int  i;
  54.         S1(char c,int i){
  55.                 this.c=c;
  56.                 this.i=i;
  57.         }
  58.         public boolean equals(Object obj){
  59.                 S1 s2=(S1)obj;
  60.                 return this.c==s2.c;
  61.         }
  62.         public void setC(char c){
  63.                 this.c=c;
  64.         }
  65.         public void setI(int i){
  66.                 this.i=i;
  67.         }
  68.         public char getC(){
  69.                 return this.c;
  70.         }
  71.         public int getI(){
  72.                 return this.i;
  73.         }
  74.         public int hashCode(){
  75.                     return 60;
  76.         }
  77. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
dicegame 发表于 2013-7-27 22:52
哥们思路确实有点问题,不过也有亮点
我借鉴了下你的思路,想了个新方法
定义一个具有26个元素的整型数组

这方法很巧妙啊。
回复 使用道具 举报
Mr_Free 发表于 2013-7-28 01:02
按照你的思路,我帮你写了一个,主要是我发现你这样的话 s加到后面如果出现重复的字母,你会再做调用一边字 ...

但是HashSet是无序的啊,存入顺序和取出顺序不一致啊
回复 使用道具 举报
这种写法会导致重复的元素进行多次判断,导致输出结果不符合要求
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马