2017-02-01 6 views
6

Javaのキーに特定の値を追加しようとしていますが、そのキーはかなり複雑ですが、値は単純なDoubleです。マップ内の用語に値を追加する

FOOSは java.util.TreeMap<Foo, Double>のインスタンスである私が使用している現在

、およびamountDoubleで、コードのように:私は要素を挿入する必要が

for (java.util.Map.Entry<Foo, Double> entry : foos.entrySet()){  
    foos.put(entry.getKey(), entry.getValue() + amount);  
} 

が、これはその中にかなり汚れて見え、Iイテレータを無効にすることを心配しました。

これを行うには良い方法がありますか?私はJavaの最新バージョンを使用しています。

+0

エントリにはentrySet()メソッドがないため、foosはEntryのインスタンスにはなりません。私はあなたのfoosが実際にTreeMapのインスタンスだと思う。 –

+0

あなたのタグを正しく得るためにうまくいっています。このサイトの初めてのユーザーはそう多くはありません。 – Bathsheba

+0

ありがとうございます。はい、あなたは正しいです。 foosは、ツリーマップのインスタンスです。 –

答えて

9

、あなたはMap#replaceAllを使用することができます挿入する新しいキーがありますが、同じキーセットを反復処理しているため、そうではありません。

+1

forloopsを行っている他のラインと比較して1ラインです – Ash

+0

はい私はこれが大好きです。ありがとうございました。 –

6

一つの方法は、Javaバージョン8ので、利用されている、Map#merge使用することである:方法基準シンボル::の使用は、スコープの分解能と混同しない

for (java.util.Map.Entry<Foo, Double> entry : foos.entrySet()){ 
    foos.merge(entry.getKey(), amount, Double::sum);  
}  

C++の演算子。

ここで私は "缶詰め"機能Double::sumを使用していますが、あなたはこのアプローチを特に強力にする独自の建物を作ることができます。詳細はhttps://docs.oracle.com/javase/8/docs/api/java/util/Map.html#merge-K-V-java.util.function.BiFunction-

+1

私はこれについて知りませんでしたが、それはクールです! – christopher

+1

私は最近これを使い始めました。 (しかし、C++から来て、彼らが '::'演算子を使わなかったらいいと思っています) – Bathsheba

+1

ええ、それは私を少しスローしましたが、実際にはかなり強力です。 – christopher

4

entry.setValueをご利用ください。ドキュメントには、

が指定された値に置き換えられます(オプションの操作)。マップに書き込みます。だから、

:潜在的にあなたの場合

foos.replaceAll((k, v) -> v + amount); 

merge便利です:あなたが唯一の値を変更したいので

for (java.util.Map.Entry<Foo, Double> entry : foos.entrySet()){  
    entry.setValue(entry.getValue() + amount)); 
} 
+0

はい、これは良い方法です。また、Java 1.8より前のバージョンでも動作します。 upvoteを持ってください! – Bathsheba

関連する問題