我有以下代码来计算数组中不同字符串的实例;
String words[] = {"the","cat","in","the","hat"};
HashMap<String,Integer> wordCounts = new HashMap<String,Integer>(50,10);
for(String w : words) {
Integer i = wordCounts.get(w);
if(i == null) wordCounts.put(w, 1);
else wordCounts.put(w, i + 1);
}
这是一种正确的做法吗?对于一项简单的任务来说似乎有点啰嗦。 HashMap
结果对我很有用,因为我将按字符串索引它。
我担心这行
else wordCounts.put(w, i + 1);
由于这个事实,可能会插入第二个key-value
对
new Integer(i).equals(new Integer(i + 1));
将是错误的,因此两个Integers
最终会在同一个String
密钥桶下,对吧?或者我只是过度考虑自己陷入困境?
答案 0 :(得分:8)
您的代码将工作 - 但使用Guava中的HashMultiset
会更简单。
// Note: prefer the below over "String words[]"
String[] words = {"the","cat","in","the","hat"};
Multiset<String> set = HashMultiset.create(Arrays.asList(words));
// Write out the counts...
for (Multiset.Entry<String> entry : set.entrySet()) {
System.out.println(entry.getElement() + ": " + entry.getCount());
}
答案 1 :(得分:6)
答案 2 :(得分:2)
你的代码非常好。您将字符串映射到整数。没有什么是重复的。
答案 3 :(得分:2)
HashMap不允许重复的键,因此地图中无法使用多个SAME键值对。
答案 4 :(得分:0)
这是一个特定于字符串的计数器,应该是通用的,并且为toString()提供了一个按值排序的选项,但它是一个面向对象的问题包装器,因为我找不到类似的东西:
package com.phogit.util;
import java.util.Map;
import java.util.HashMap;
import java.lang.StringBuilder;
public class HashCount {
private final Map<String, Integer> map = new HashMap<>();
public void add(String s) {
if (s == null) {
return;
}
Integer i = map.get(s);
if (i == null) {
map.put(s, 1);
} else {
map.put(s, i+1);
}
}
public int getCount(String s) {
if (s == null) {
return -1;
}
Integer i = map.get(s);
if (i == null) {
return -1;
}
return i;
}
public String toString() {
if (map.size() == 0) {
return null;
}
StringBuilder sb = new StringBuilder();
// sort by key for now
Map<String, Integer> m = new TreeMap<String, Integer>(map);
for (Map.Entry pair : m.entrySet()) {
sb.append("\t")
.append(pair.getKey())
.append(": ")
.append(pair.getValue())
.append("\n");;
}
return sb.toString();
}
public void clear() {
map.clear();
}
}
答案 5 :(得分:0)
您的代码对我来说很好,并且没有问题。借助Java 8功能,它可以简化为:
String words[] = {"the","cat","in","the","hat"};
HashMap<String,Integer> wordCounts = new HashMap<String,Integer>(50,10);
for(String w : words) {
wordCounts.merge(w, 1, (a, b) -> a + b);
}
以下代码
System.out.println("HASH MAP DUMP: " + wordCounts.toString());
将打印出来。
HASH MAP DUMP: {cat=1, hat=1, in=1, the=2}