bagまたはmulti-setであるが、整数ではなくBigDecimal
の数でオブジェクトをカウントする必要があります。整数でない袋Map <Object、BigDecimal>
例えば、私は、砂糖2.3kg、塩4.5kg、砂糖1.4kgを追加するかもしれません。私がget
砂糖を飲むと3.7になります。もし私がget
塩なら4.5を返します。
私は十分に簡単に書くことができますが、私が使用できる既存の実装はありますか?このデータ構造とは何ですか?
bagまたはmulti-setであるが、整数ではなくBigDecimal
の数でオブジェクトをカウントする必要があります。整数でない袋Map <Object、BigDecimal>
例えば、私は、砂糖2.3kg、塩4.5kg、砂糖1.4kgを追加するかもしれません。私がget
砂糖を飲むと3.7になります。もし私がget
塩なら4.5を返します。
私は十分に簡単に書くことができますが、私が使用できる既存の実装はありますか?このデータ構造とは何ですか?
あなただけの新しいを使用することができます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}
カスタム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
この回答は本当に素晴らしく、受け入れられるはずです – Supahupe
'BigDecimal(double)'コンストラクタは使わないでください。代わりに 'BigDecimal.valueOf(double)'を使用してください。 [javadoc](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-)もそうです(#3)。それはあなたの解決策の結果を '3.7'に変えるでしょう。 – Andreas
Java 8では、 'add()'の本体は 'compute(key、(k、v) - > v == null?value:v.add(value)));でなければなりません。 – Andreas
偉大な答え。この例で言及した値を使用した方が良いでしょう。 :-) – Andreas
これは役に立ちます - 私が望んでいただけです。私が働いているJava 7でまだ残っていることは残念です。 –