使用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}
- Apache Commons Lang3 Hashcode,Equals和ToString包括Enums
- ==运算符和equals()之间有什么区别? (用hashcode()???)
- ConcurrentHashMap构造函数参数?
- 使用注释生成equals / hashcode / toString
- 这些实体的equals和hashCode(Spring MVC + Hibernate)
- 为什么默认的Object.toString()返回hashCode的hex表示?
- 为什么HashMap会重新生成密钥对象提供的哈希码?
- 为什么在Object中定义了equals和hashCode?
- 如何自定义Eclipse生成的hashCode()和equals()?