我需要将对象映射到他们的计数,就像我使用bag或multi-set但使用BigDecimal
计数而不是整数。
因此,例如,我可能会添加2.3千克糖,4.5千克盐和另外1.4千克糖。然后,如果我get
糖,它将返回3.7。如果我get
盐,它将返回4.5。
我可以轻松地编写一个,但可以使用现有的实现吗?什么是这个数据结构?
答案 0 :(得分:3)
您可以使用Map
中介绍的新java-8
api merge:
Map<String, BigDecimal> counts = new HashMap<>();
counts.merge("sugar", BigDecimal.valueOf(2.3), BigDecimal::add);
counts.merge("salt", BigDecimal.valueOf(4.5), BigDecimal::add);
counts.merge("pepper", BigDecimal.valueOf(1.8), BigDecimal::add);
counts.merge("sugar", BigDecimal.valueOf(1.4), BigDecimal::add);
System.out.println(counts); // {pepper=1.8, salt=4.5, sugar=3.7}
答案 1 :(得分:1)
自定义HashMap怎么样?想不出更简单的解决方案
在Java 7中:
class Bag extends HashMap<Object, BigDecimal> {
public void add(Object key, BigDecimal value){
if (containsKey(key))
value = get(key).add(value);
put(key, value);
}
}
或者,在Java 8中:
class Bag extends HashMap<Object, BigDecimal> {
public void add(Object key, BigDecimal value){
merge(key, value, BigDecimal::add);
}
}
用法:
Bag bag = new Bag();
bag.add("Sugar", BigDecimal.valueOf(2.3));
bag.add("Salt", BigDecimal.valueOf(4.5));
bag.add("Sugar", BigDecimal.valueOf(1.4));
System.out.println(bag.get("Sugar")); // Prints 3.7