2011-08-29 101 views
2

如何對一個字符串進行分區以提取出現在其中的所有單詞/術語並計數每個單詞出現的次數? 例如讓: 字符串q = "foo bar foo" 我想DS {<foo,2>, <bar,1>}。這是我用*編寫的最細節的代碼。錯誤或更少的冗長選擇?如何計算字符串數組中的重複項?

String[] split = q.toString().split("\\s"); 
     Map<String, Integer> terms = new HashMap<String, Integer>(); 

     for (String term : split) { 
      if(terms.containsKey(term)){ 
       terms.put(term, terms.get(term)+1); 
      } 
     } 

(未編譯它)

+3

你很近。只需添加一個「else」(如果術語*在地圖中不是*), –

回答

5

修改後的代碼:

String[] split = q.toString().split("\\s"); 
Map<String, Integer> terms = new HashMap<String, Integer>(); 

for (String term : split) { 
    int score = 0; 
    if(terms.containsKey(term)){ 
     score = terms.get(term); 
    } 

    terms.put(term, score +1); 
} 

PS:未經測試。

0

我會選擇Elite Gentleman建議的代碼,但我只是把它作爲一個討論點:怎麼樣使用StringTokenizer?如果可伸縮性/性能是一個問題,分詞器的性能會更好嗎?在這種情況下,您可能只需循環一次字符串,而不是先執行正則表達式分割,然後再遍歷數組。

事情是這樣的:

StringTokenizer st = new StringTokenizer(s); 
HashMap<String, Integer> terms = new HashMap<String, Integer>(); 

while (st.hasMoreElements()) { 

    String term = st.nextToken(); 
    int score = 0; 
    if(terms.containsKey(term)){ 
     score = terms.get(term); 
    } 

    terms.put(term, score +1); 
} 

我知道StringTokenizer的,以爲不會被棄用,是根據Java文檔的遺留類,它是不推薦使用:

的StringTokenizer是傳統類儘管在新代碼中不鼓勵使用它,但仍保留了兼容性 的原因。建議 任何尋求此功能的人都使用字符串 或java.util.regex包的拆分方法。

但是,我想知道在這種情況下,如果是一個簡單的標記,它會給出更多的高性能結果。

有什麼想法?

相關問題