【问题标题】:Simple digit counter method in JavaJava中的简单数字计数器方法
【发布时间】:2026-02-05 07:40:01
【问题描述】:

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

例如如果输入方法的字符串是“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;
    }

【问题讨论】:

  • 需要从数字字符映射到数字;减去“0”。例如计数器[s.charAt(j) - '0']++;

标签: java methods counter


【解决方案1】:

请参阅my comment 了解如何更正此问题。

您还应该考虑直接循环字符串的字符,而不是跟踪字符串中的位置并使用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;      
}

请注意,我必须使用 Map&lt;Integer, Integer&gt; 即兴发挥,因为 Java 本身并不提供多重集合 :-(

【讨论】:

  • 这是你的最终答案吗? :)
  • @MattGreer 我知道它对 Unicode 不友好(因为 Character.isDigit 不限于 ASCII),但它会在这里 ;)
  • 太棒了,谢谢..我想我应该对 .charAt() 方法进行更多研究。我假设该方法正在返回数字的实际整数值。
【解决方案2】:

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

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

 for(int j= 0; j 

【讨论】:

  • counter 只需 int[10],因为十进制数字只有十位数字;) 但是 +1 表示贡献。
  • 是的,后来处理了:)
【解决方案3】:

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

【讨论】:

  • 是的,现在完全有道理。感谢所有回答的人。
【解决方案4】:

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

【讨论】:

  • 他在以十为底数数,所以他只需要 10 个桶
【解决方案5】:

如果你们想要任何东西的计数器,只要把它变成一个字符串,然后使用字符串方法 .length() 来计算长度,如果那是你要找的。如果我没记错的话,length() 方法会返回一个整数,这样就可以了。如本页某处所示,数组具有相同的属性,但这是用于存储内容的空间的数量。

【讨论】: