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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦大忠 中级黑马   /  2013-10-15 12:38  /  1646 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package qin.com;
import java.util.Arrays;

//去除一个字符串中字母出现的次数,如字符串“fdsafadsfdfew124”,
//输出格式为:a(2)b(3)c(1)……
public class Demo {
     public static void main(String[] args)
         {
             String q = "fdsafadsfdfew124";
             System.out.println(getNum(q));
         }
public static StringBuffer getNum(String x){
      StringBuffer sb = new StringBuffer();
      char[] w = x.toCharArray();//将字符串转换成字符数组
      Arrays.sort(w);//对字符数组的排序
      int counter=1;
      for(int i=0;i<w.length-1;i++){
           q:for(int j = i+1;j<w.length;j++){
                if(w[i]==w[j]){
                counter++;
                }
               else{ break q;}
            }//依次对比,直到不相同,用counter记录出现的次数
      sb.append(w[i]+"("+counter+")");
      i = counter-1;//字母出现的次数-1,做为下一个开始对比的数的角标
      counter = 1;//重置计数器
     }
   return sb;
}
}

编译器提示的错误是Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

4 个回复

倒序浏览
出现死循环了,你debug一下就很容易看出来“ i = counter-1;//字母出现的次数-1,做为下一个开始对比的数的角标”,每次i都是0。我用的string q="fds"测试的,debug结果一直打印f,d(1)f(1)f(1)f(1)f(1)f(1)f(1)f(1)f(1)f(1)f(1)f(1)

`SH (58.11 KB, 下载次数: 28)

`SH

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

回复 使用道具 举报

/*
错误之处已经在下面做了注释:
还有,楼主的这个程序还有不足,就是得到的结果有重复数据;
建议再写一个方法去除StringBuffer中的重复元素,
并且,StringBuffer容器已在jdk1.5之后被StringBuild替代,
因为StringBuffer是线程同步,而单线程建议使用StringBuild,这样效率会高些;
*/

import java.util.Arrays;
//去除一个字符串中字母出现的次数,如字符串“fdsafadsfdfew124”,
//输出格式为:a(2)b(3)c(1)……

class Demo {
     public static void main(String[] args)
         {
             String q = "fdsafadsfdfew124";
             System.out.println(getNum(q));
         //getNum(q);
                 }
public static StringBuffer getNum(String x){
      StringBuffer sb = new StringBuffer();
      char[] w = x.toCharArray();
      Arrays.sort(w);
      int counter=1;
      for(int i=0;i<w.length-1;i++)
                  {
           q:for(int j = i+1;j<w.length;j++)
                           {
                if(w[i]==w[j])
                counter++;
                                else
                                break q;
                           }
        // i = counter-1;
                sb.append(w[i]+"("+counter+")");
      counter = 1;
     }
   return sb;
        }
}

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

回复 使用道具 举报
做了一点小改动,i=counter-1;换成i+=counter-1;发现好了,能达到预期目的了,哈哈哈,我真是个人才啊!
回复 使用道具 举报
秦大忠 发表于 2013-10-15 21:29
做了一点小改动,i=counter-1;换成i+=counter-1;发现好了,能达到预期目的了,哈哈哈,我真是个人才啊! ...

:L。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马