我目前有一张存储以下信息的地图:
Map<String,String> animals= new HashMap<String,String>();
animals.put("cat","50");
animals.put("bat","38");
animals.put("dog","19");
animals.put("cat","31");
animals.put("cat","34");
animals.put("bat","1");
animals.put("dog","34");
animals.put("cat","55");
我想在上面的地图中创建一个包含唯一项目总计的新地图。所以在上面的例子中,cat的数量是170,bat的数量是39,依此类推。
我尝试使用Set在地图中查找唯一的动物条目,但是,我无法获得每个唯一条目的总计数
答案 0 :(得分:1)
首先,不要使用String
进行算术运算,使用int
或double
(或BigInteger
/ BigDecimal
,但是这可能是矫枉过正的)。我建议您将地图设为Map<String, Integer>
。
其次,如果给定的密钥已经存在于地图中,Map.put()
将覆盖之前的值,因此@Guy指出您的地图实际上只包含{cat:55, dog:34, bat:1}
。您需要以某种方式获取以前的值才能保留它。
经典方式(Java-8之前版本)就像这样:
public static void putOrUpdate(Map<String, Integer> map, String key, int value) {
Integer previous = map.get(key);
if (previous != null) {
map.put(key, previous + value);
} else {
map.put(key, value);
}
}
Java 8为Map
添加了许多有用的方法,使这种模式更容易,例如Map.merge()
为您执行put-or-update:
map.merge(key, value, (p, v) -> p + v);
您可能还会发现multiset是一种更好的数据结构,因为它可以为您处理递增/递减;番石榴提供a nice implementation。
答案 1 :(得分:0)
盖伊说。现在你有一只蝙蝠,一只狗和一只猫。另一个'put'将覆盖你过去的价值观。定义。映射存储键映射对,其中映射中的每个键都是唯一的。如果你必须通过地图来做,你可以及时总结。例如,如果您想为cat添加另一个值并且想要更新它,则可以这样做:
animals.put("cat", animals.get("cat") + yourNewValue);
您的猫的价值将会更新。例如,我们的数字是float / int / long,而不是你的字符串。如果你必须通过字符串来完成,你可以在这种情况下使用:
animals.put("cat", Integer.toString(Integer.parseInt(animals.get("cat")) + yourNewValue));
然而,它很难看。我建议创建
Map<String, Integer> animals = new HashMap<String, Integer>();