0

我正在尝试创建一种方法来计算字符串中数字出现的次数并将它们记录到数组中。

例如,如果输入到方法中的字符串是“1223000”,那么 counter[1] =1,counter[2] =2,counter[3] = 1,counter[0] = 3。

我不断收到 arrayindexoutofbounds 错误,这是我到目前为止的代码:

//method: count number of occurences for digits
    public static int[] count(String s){

        int[] counter = new int[10];

        for(int j= 0; j < s.length(); j++){
            if (Character.isDigit(s.charAt(j)))
                counter[s.charAt(j)] += 1;
        }

        return counter;
    }
4

5 回答 5

4

请参阅我的评论以了解如何更正该问题。

您还应该考虑直接循环字符串的字符,而不是跟踪字符串中的位置并使用charAt.

例如,

public static int[] countDigits(final String str) {
  final int[] freq = new int[10];
  for (final char c : str.toCharArray()) {
    if (Character.isDigit(c)) {
      ++freq[c - '0'];
    }
  }
  return freq;
}

使用以下代码测试上述内容不会产生错误(java -ea DigitFreqTest)。

final String input = "1223000";
final int[] freq = countDigits(input);
assert freq[0] == 3 && freq[1] == 1 && freq[2] == 2 && freq[3] == 1;

请注意,上面不支持 Unicode……在这种情况下,您可能希望改用Character.getNumericValue.

public static Map<Integer, Integer> countNumerals(final String str) {
  final Map<Integer, Integer> freq = new HashMap<Integer, Integer>(10);
  for (final char c : str.toCharArray()) {
    if (Character.isDigit(c)) {
      final int num = Character.getNumericValue(c);
      Integer occ = freq.get(num);
      if (occ == null) {
        occ = 0;
      }
      freq.put(num, occ + 1);
    }
  }
  return freq;      
}

注意我不得不使用 a 即兴创作,Map<Integer, Integer>因为 Java 本身并不提供多重集合:-(

于 2012-08-09T02:35:06.957 回答
4

s.charAt(j) 将为您提供该数字的字符编号,而不是整数值。

这是非常正确的代码,但你会得到正确的想法: String s = "1223000"; int[] counter = new int[10];

    for(int j= 0; j < s.length(); j++){

        if (Character.isDigit(s.charAt(j))) {
            int i = Integer.parseInt(s.substring(j, j+1));
            counter[i] += 1;
        }
            //unter[s.charAt(j)] += 1;
    }</code>
于 2012-08-09T02:35:58.423 回答
1

您得到的ArrayIndexOutOfBoundsException原因是s.charAt(j)incounter[s.charAt(j)]将返回char例如数字'1',然后使用 ASCII 将 char 转换为 int ,因此char '1'int 49超出数组索引。

于 2012-08-09T02:47:41.027 回答
0

计数器数组(int[] 计数器)的大小应该是 s 的长度: int[] counter = new int[s.length()];

于 2012-08-09T02:36:41.497 回答
0

If you guys want a counter for anything, just turn it into a string, then use the string method .length() to figure out the length, if that's what you're looking for. And if I'm not mistaken, the length() method returns an integer, so there you go. And as shown somewhere on this page, arrays have the same attribute, but that's for how many spaces there are that have things stored in them.

于 2014-11-25T12:29:56.827 回答