2012-08-09 68 views
0

我想創建一個方法來計算字符串中數字的出現次數並將它們記錄到數組中。Java中的簡單數字計數器方法

例如,如果進入的方法中的字符串是 「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; 
    } 
+5

您需要將數字字符映射到數字;減去'0'。例如counter [s.charAt(j) - '0'] ++; – oldrinb 2012-08-09 02:32:32

回答

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本身並沒有提供一個多重集合:-(

+0

這是你最終的答案嗎? :) – 2012-08-09 02:40:43

+0

@MattGreer我知道它不是Unicode友好的(因爲'Character.isDigit'不限於ASCII),但它會在這裏;) – oldrinb 2012-08-09 02:41:45

+1

我在你的許多最終關鍵字戳動樂趣 – 2012-08-09 02:46:47

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> 
+0

'counter'只需要'int [10]',因爲十進制數字只有十位;)+1作爲貢獻,但是。 – oldrinb 2012-08-09 02:39:53

+0

是的,後來處理:) – 2012-08-09 02:45:00

0

The size of the counter array (int[] counter) should be the length of s: int[] counter = new int[s.length()];

+3

他在基數十的位數,所以他只需要10桶 – 2012-08-09 02:39:02

1

You are getting ArrayIndexOutOfBoundsException因爲s.charAt(j)counter[s.charAt(j)]將返回數量char例如'1',然後轉換字符使用ASCII所以爲int char '1'將會出現int 49這樣的數組索引。

+0

雅現在總的感覺。感謝所有回答的人。 – 2012-08-09 02:50:39

0

如果你們想要任何東西的計數器,只要把它變成一個字符串,然後使用字符串方法.length()來計算出長度,如果這就是你想要的。如果我沒有弄錯,length()方法返回一個整數,所以你去。正如本頁的某個地方所示,數組具有相同的屬性,但這就是存在多少空間的空間。