2011-08-29 62 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包的拆分方法。

但是,我想知道在这种情况下,如果是一个简单的标记,它会给出更多的高性能结果。

有什么想法?

相关问题