2017-02-21 10 views
5

bagまたはmulti-setであるが、整数ではなくBigDecimalの数でオブジェクトをカウントする必要があります。整数でない袋Map <Object、BigDecimal>

例えば、私は、砂糖2.3kg、塩4.5kg、砂糖1.4kgを追加するかもしれません。私がget砂糖を飲むと3.7になります。もし私がget塩なら4.5を返します。

私は十分に簡単に書くことができますが、私が使用できる既存の実装はありますか?このデータ構造とは何ですか?

答えて

3

あなただけの新しいを使用することができますMap api mergeが導入されましたjava-8

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} 
+0

偉大な答え。この例で言及した値を使用した方が良いでしょう。 :-) – Andreas

+0

これは役に立ちます - 私が望んでいただけです。私が働いているJava 7でまだ残っていることは残念です。 –

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 
+1

この回答は本当に素晴らしく、受け入れられるはずです – Supahupe

+1

'BigDecimal(double)'コンストラクタは使わないでください。代わりに 'BigDecimal.valueOf(double)'を使用してください。 [javadoc](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-)もそうです(#3)。それはあなたの解決策の結果を '3.7'に変えるでしょう。 – Andreas

+0

Java 8では、 'add()'の本体は 'compute(key、(k、v) - > v == null?value:v.add(value)));でなければなりません。 – Andreas

関連する問題