如何计算字符串数组中的重复项?

时间:2011-08-29 08:42:40

标签: java string apache-commons

如何对String进行分区以提取其中出现的所有单词/术语并计算每次出现的次数? 例如,让: 字符串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);
            }
        }

(尚未编译)

2 个答案:

答案 0 :(得分: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:未经测试。

答案 1 :(得分:0)

我会选择Elite Gentleman建议的代码,但我只是把它作为讨论点:使用StringTokenizer怎么样?如果可伸缩性/性能是个问题,那么tokenizer会表现得更好吗?在这种情况下,您可能只需要遍历字符串一次,而不是先进行正则表达式分割,然后再遍历数组。

这样的事情:

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,据认为不被弃用,是一个Legacy类,根据java文档,不建议使用它:

  

StringTokenizer是为保持兼容性而保留的旧类   原因虽然在新代码中不鼓励使用它。建议   任何寻求此功能的人都使用String的split方法   或者改为java.util.regex包。

但是我想知道在这种情况下是否有一个简单的令牌,它会提供更高效的结果。

有什么想法吗?