如何对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);
}
}
(尚未编译)
答案 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包。
但是我想知道在这种情况下是否有一个简单的令牌,它会提供更高效的结果。
有什么想法吗?