見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<Integer, Integer>
即興因爲Java本身並沒有提供一個多重集合:-(
您需要將數字字符映射到數字;減去'0'。例如counter [s.charAt(j) - '0'] ++; – oldrinb 2012-08-09 02:32:32