使用HashMap计算实例

时间:2012-10-31 17:29:44

标签: java hashmap equals hashcode

我有以下代码来计算数组中不同字符串的实例;

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密钥桶下,对吧?或者我只是过度考虑自己陷入困境?

6 个答案:

答案 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)

是的,你这样做是正确的。如果提供相同的密钥,HashMap将替换值。

来自HashMap#put

的Java文档
  

将指定的值与此映射中的指定键相关联。如果地图以前包含该键的映射,则将替换旧值。

答案 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}
相关问题