我想问一下
在Hashmap中
如果元素ID相同,我如何计算所有数字?
有人可以给我一些想法吗?
或者只是给我一些有用的参考链接供我学习
感谢
import java.util.*;
import java.util.Iterator;
public class hash {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("ABS", new Double(3434.34));
hashMap.put("ABD", new Double(123.22));
hashMap.put("ABD", new Double(123.22));
hashMap.put("ABD", new Double(123.22));
hashMap.put("ABD", new Double(123.22));
Set set = hashMap.entrySet();
Iterator i = set.iterator();
while (i.hasNext()) {
Map.Entry me = (Map.Entry) i.next();
System.out.println(me.getKey() + " : " + me.getValue());
}
}
}
答案 0 :(得分:5)
你做不到。您需要一个支持计数键的数据结构。地图实现没有。
示例代码:
final Multimap<String, Double> map =
Multimaps.newListMultimap(
Maps.<String, Collection<Double>>newTreeMap(),
new Supplier<List<Double>>(){
@Override
public List<Double> get() {
return Lists.newArrayList();
}});
map.put("ABS", Double.valueOf(3434.34));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
for (final Multiset.Entry<String> key : map.keys().entrySet()) {
System.out.println(
"Key: "
+key.getElement()
+", count: "
+key.getCount()
+", values: "
+map.get(key.getElement())
);
}
<强>输出:强>
键:ABD,计数:4,值:[123.22,123.22,123.22,123.22]
关键:ABS,计数:1,值:[3434.34]
Apache Commons / Collections中的MultiMap也可以解决问题。
如果您不允许使用外部库,您仍然可以使用Map<String, List<Double>>
实现此功能。创建一个像这样的方法
帮助方法
public static <K, V> void assignValue(
final Map<K, Collection<V>> map, final K key, final V value) {
Collection<V> values = map.get(key);
if(values==null){
values=new ArrayList<V>();
map.put(key, values);
}
values.add(value);
}
<强>用法强>
并像这样使用它:
final Map<String, Collection<Double>> map =
new HashMap<String, Collection<Double>>();
assignValue(map, "ABS", Double.valueOf(3434.34));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
for(final Entry<String, Collection<Double>> entry : map.entrySet()){
System.out.println(new StringBuilder()
.append("Key: ")
.append(entry.getKey())
.append(", count: ")
.append(entry.getValue().size())
.append(", values: ")
.append(entry.getValue())
.toString());
}
<强>输出强>
键:ABD,计数:4,值:[123.22,123.22,123.22,123.22]
关键:ABS,计数:1,值:[3434.34]
答案 1 :(得分:1)
HashMap是一个 Map ,它不能包含重复的键。如果允许重复键,您希望在调用map.get(duplicateKey)
时返回哪个值?
答案 2 :(得分:1)
阅读this,特别是'put'方法,其中包含:
将指定的值与此映射中的指定键相关联。如果地图以前包含此键的映射,则替换旧值。
您构建代码的方式意味着HashMap将只包含两个键/值对。
public class hash {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
hashMap.put("ABS", new Double(3434.34)); // "ABS" key created. 1 object in map.
hashMap.put("ABD", new Double(123.22)); // "ABD" key created. 2 objects in map.
hashMap.put("ABD", new Double(123.22)); // "ABD" reference will point to new value.
hashMap.put("ABD", new Double(123.22)); // .. and again
hashMap.put("ABD", new Double(123.22)); // .. and again
因此,当您编写五个put行时,只有两个对象将被放置在HashMap中。
您可以使用
hashMap.size()
返回'hashMap'中有多少个键/值对的int值。
答案 3 :(得分:0)
所以你需要将Double + Count作为值然后使用它而不是Double,因为练习使它扩展java.lang.Number:)
Class DoubleCount{
final double value;
private int count;
DoubleCount(double value){
this.value = value;
}
public int getCount(){
return count;
}
public double getValue(){
return value;
}
public int incCount(){
return ++count;
}
}
答案 4 :(得分:-1)
size = hashMap.size();
然后使用for循环来迭代