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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜正冬 中级黑马   /  2012-11-22 16:37  /  2894 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;
public class Test1 {
public static void main(String[] args) {
  // 取出一个字符串中字母出现的次数。如:"abcdekka27qoq" a(2)b(1)k(2)...
  stringTime("1345353535");
}
static void stringTime(String s) {
  int[] count = new int[s.length()];
  for (int x = 0; x <= s.length(); x++) {
   for (int y = x; y <= s.length(); y++) {
    if (s.charAt(x) == s.charAt(y))
     ;
    count[x]++;
   }
   System.out.println(s.charAt(x) + "" + count[x]);
  }
}
}

未命1名.jpg (244.55 KB, 下载次数: 47)

未命1名.jpg

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

15 个回复

倒序浏览
public class bbb {
public static void main(String[] args) {
   // 取出一个字符串中字母出现的次数。如:"abcdekka27qoq" a(2)b(1)k(2)...
   stringTime("1345353535");
}
static void stringTime(String s) {
   int[] count = new int[s.length()];
   for (int x = 0; x < s.length(); x++) {//你的错误时数组越界了,x从0开始,可是不能和数组的长度一样,最大的那个下标应该是数组长度减1
    for (int y = x; y < s.length(); y++) {
     if (s.charAt(x) == s.charAt(y))
      ;
     count[x]++;
    }
    System.out.println(s.charAt(x) + "" + count[x]);
   }
}
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 金鑫 于 2012-11-22 16:53 编辑

for (int x = 0; x <= s.length(); x++) {
   for (int y = x; y <= s.length(); y++) {
你的程序出现角标越界异常原因在这里,因为字符串的角标是从0开始取,所以肯定不能=s.length()

if (s.charAt(x) == s.charAt(y))
     ;
你这里还多了一个分号
  1. int[] count = new int[s.length()];
  2. for (int x = 0; x < s.length(); x++)
  3. {
  4. for (int y = x; y < s.length(); y++)
  5. {
  6. if (s.charAt(x) == s.charAt(y))

  7. count[x]++;
  8. }System.out.println(s.charAt(x) + ":" + count[x]+"次");
复制代码
最后运行结果:
1:1次
3:4次
4:1次
5:4次
3:3次
5:3次
3:2次
5:2次
3:1次
5:1次

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
你的程序的错误是数组越界了,x是从0开始的,那么最大长度应该是s.length()-1才对,应该改成下面这样的
public class Test1 {
public static void main(String[] args) {
   // 取出一个字符串中字母出现的次数。如:"abcdekka27qoq" a(2)b(1)k(2)...
   stringTime("1345353535");
}
  static void stringTime(String s) {
    int[] count = new int[s.length()];
    for (int x = 0; x <= s.length()-1; x++) {       // 这里改成s.length()-1
     for (int y = x; y <= s.length()-1; y++) {      //这里也改成s.length()-1
      if (s.charAt(x) == s.charAt(y))
            ;                                                         //这一行多了一个分号,应该去掉
      count[x]++;
     }
     System.out.println(s.charAt(x) + ":" + count[x]+"次");  //我觉得输出结果改成这样阅读性更高一点
    }
  }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
其他地方没什么大问题,问题再
for (int x = 0; x <= s.length(); x++) {
   for (int y = x; y <= s.length(); y++) {

如果:x<=s.length();那么x最后就会超出数组的界限;报 “数组越界”的错误

所以要改成:x<s.length);

试一试

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
  1. import java.util.*;
  2. class MyCiShu
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.         CiShu cishu=new CiShu("abcdefgabcdefgqweweere");
  7.     cishu.ciShu();
  8.         }
  9. }
  10. class CiShu
  11. {
  12.         private String str;
  13.         CiShu(String str)
  14.         {
  15.                 this.str=str;
  16.         }
  17.         public  void ciShu()
  18.         {
  19.                 char[] ch=str.toCharArray();//将字符串转化我字符数组
  20.                 HashMap hm=new HashMap();
  21.         for(int i=0;i<ch.length;i++)
  22.                 {
  23.                         hm.put(ch[i],0);//将字符的键值存在hashmap集合中,值默认为0;
  24.                 }
  25.                 int[] num=new int[hm.size()];//定义一个数组,用于存储和键相对应的值的个数,也就是存储每个字符出现的次数。
  26.                 Set set=hm.keySet();
  27.                 Iterator it=set.iterator();
  28.                   for(int i=0;i<hm.size();i++)
  29.                 {
  30.                           Object obj=it.next();//获取hashmap中的键。
  31.                         for(int t=0;t<ch.length;t++)//遍历所有字符
  32.                         {
  33.                                 if(obj==ch[t])//如果字符和键相等,则相对应的值++;用这种方法记录每个字符出现的次数
  34.                                         num[i]++;
  35.                         }
  36.                         //覆盖旧hashmap,生成新的hashmap。
  37.                         hm.put(obj,num[i]);//再次将处理好的键值对放入hashmap中,其实相当于用值替换0,或者说是用每个字符出现的次数作为和键对应的值,存在hashmap中。
  38.                 }
  39.                 System.out.println(hm);
  40.         }
  41. }
复制代码
这次自己写的,和你的功能相似,其实还是用集合的思想解决这类问题方便一些。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
王震阳 发表于 2012-11-22 17:46
这次自己写的,和你的功能相似,其实还是用集合的思想解决这类问题方便一些。
...

33行有问题
应该改成if(obj.equals(ch[t]))
回复 使用道具 举报
森仔 中级黑马 2012-11-22 21:12:19
8#
在遍历数组时,要提防数组越界的错误。你用的是典型的双重for循环,当外层循环到最后一位时,指针已指到了数组最后一位,没了比较对象,内层循环再一运行就出现了数组越界的错误啦。
回复 使用道具 举报
徐大鹏 发表于 2012-11-22 20:37
33行有问题
应该改成if(obj.equals(ch[t]))

是的,第33行改成你的方法可能更好,但是在这里Object类的==和equals好像一样的吧?
回复 使用道具 举报
王震阳 发表于 2012-11-22 21:22
是的,第33行改成你的方法可能更好,但是在这里Object类的==和equals好像一样的吧? ...

你那可以编译出来?
回复 使用道具 举报
徐大鹏 发表于 2012-11-22 21:39
你那可以编译出来?

可以的呀。


统计字母次数运行截图.jpg (206.14 KB, 下载次数: 40)

统计字母次数运行截图.jpg
回复 使用道具 举报
王震阳 发表于 2012-11-22 21:45
可以的呀。

我这真不行。。

java.jpg (38.27 KB, 下载次数: 42)

java.jpg
回复 使用道具 举报
徐大鹏 发表于 2012-11-22 21:56
我这真不行。。

对了,我的JDK是1.7的,你的那个版本的?
回复 使用道具 举报
王震阳 发表于 2012-11-22 22:50
对了,我的JDK是1.7的,你的那个版本的?

我的是1.6的
回复 使用道具 举报
徐大鹏 发表于 2012-11-22 22:53
我的是1.6的

难道真是JDK的问题?奇怪了。
回复 使用道具 举报
王震阳 发表于 2012-11-22 22:57
难道真是JDK的问题?奇怪了。

应该是的,好神奇的JDK
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马