从java中获取Map中唯一项的总和

时间:2016-12-07 09:13:08

标签: java hashmap

我目前有一张存储以下信息的地图:

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在地图中查找唯一的动物条目,但是,我无法获得每个唯一条目的总计数

2 个答案:

答案 0 :(得分:1)

首先,不要使用String进行算术运算,使用intdouble(或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>();