包含非整数计数的地图<object,bigdecimal =“”>

时间:2017-02-21 16:02:32

标签: java data-structures collections

我需要将对象映射到他们的计数,就像我使用bagmulti-set但使用BigDecimal计数而不是整数。

因此,例如,我可能会添加2.3千克糖,4.5千克盐和另外1.4千克糖。然后,如果我get糖,它将返回3.7。如果我get盐,它将返回4.5。

我可以轻松地编写一个,但可以使用现有的实现吗?什么是这个数据结构?

2 个答案:

答案 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