我正在尝试创建一个方法,该方法将计算字符串中数字的出现次数并将其记录到数组中。
例如,如果输入方法的字符串是“1223000”,则计数器[1] = 1,计数器[2] = 2,计数器[3] = 1,计数器[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 :(得分:4)
请参阅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本身并不提供多集合集合: - (
答案 1 :(得分: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>
答案 2 :(得分:1)
您收到ArrayIndexOutOfBoundsException
因为s.charAt(j)
中的counter[s.charAt(j)]
将返回char
的数字,例如'1'
,然后使用ASCII将char转换为int char '1'
1}}将int 49
因此超出数组索引。
答案 3 :(得分:0)
计数器数组(int [] counter)的大小应该是s的长度: int [] counter = new int [s.length()];
答案 4 :(得分:0)
如果你们想要一个计数器,只需将它变成一个字符串,然后使用字符串方法.length()来计算长度,如果这是你正在寻找的东西。如果我没有弄错,length()方法返回一个整数,所以你去。如本页某处所示,数组具有相同的属性,但是有多少空格存储了数据。