您可能经常需要计数器来了解数据库或文本文件中某些内容(例如单词)的出现频率。通过使用Java中的HashMap可以轻松实现计数器。本文比较了实现计数器的不同方法。最后,将得出一个有效的结论。
-
天真版计数器
天真版的,它可以通过以下方式实现:
String s = “one two three two three three”;String[] sArr = s.split(" ");
//naive approach
HashMap<String, Integer> counter = new HashMap<String, Integer>();
for (String a : sArr) {
if (counter.containsKey(a)) {
int oldValue = counter.get(a);
counter.put(a, oldValue + 1);
} else {
counter.put(a, 1);
}}
在每个循环中,您检查密钥是否存在。如果是这样,则将旧值增加1;否则,将其设置为1。此方法简单明了,但这不是最有效的方法。由于以下原因,该方法的效率较低:
当一个键已经存在时,containsKey(),get()被调用两次。这意味着搜索地图两次。
由于Integer是不可变的,因此每个循环将创建一个新循环以增加旧值 -
更好的counter
自然地,我们想要一个可变的整数以避免创建许多Integer对象。可变整数类可以定义如下:
class MutableInteger {private int val;
public MutableInteger(int val) {
this.val = val;
}public int get() {
return val;
}public void set(int val) {
this.val = val;
}//used to print value convinently
public String toString(){
return Integer.toString(val);
}}
并将计数器改进并更改为以下内容: