使用HashMap计算实例

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

String words[] = {"the","cat","in","the","hat"}; HashMap wordCounts = new HashMap(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密钥桶下,对吧? 或者我只是过度思考自己陷入困境?

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

来自HashMap#put Java doc HashMap#put

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

您的代码将起作用 – 但使用Guava的 HashMultiset会更简单。

 // Note: prefer the below over "String words[]" String[] words = {"the","cat","in","the","hat"}; Multiset set = HashMultiset.create(Arrays.asList(words)); // Write out the counts... for (Multiset.Entry entry : set.entrySet()) { System.out.println(entry.getElement() + ": " + entry.getCount()); } 

你的代码非常好。 您将字符串映射到整数。 没有什么是重复的。

HashMap不允许重复 ,因此地图中无法使用多个SAME键值对。

这是一个特定于字符串的计数器,应该是通用的,并且为toString()提供了一个按值排序的选项,但它是一个面向对象的问题包装器,因为我找不到类似的东西:

 package com.phogit.util; import java.util.Map; import java.util.HashMap; import java.lang.StringBuilder; public class HashCount { private final Map 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 m = new TreeMap(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(); } } 

你的代码看起来很好,并没有问题。 感谢Java 8的function,它可以简化为:

 String words[] = {"the","cat","in","the","hat"}; HashMap wordCounts = new HashMap(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}