すべてのキーと値を1つのAハッシュマップから別のBにコピーする必要がありますが、既存のキーと値を置き換える必要はありません。
それを行うための最良の方法は何ですか?
代わりに、keySetを繰り返して、存在するかどうかを確認することを考えていました。
Map temp = new HashMap(); // generic later
temp.putAll(Amap);
A.clear();
A.putAll(Bmap);
A.putAll(temp);
回答:
一時的なものを作成しても構わMap
ないと思っているようですので、次のようにします。
Map tmp = new HashMap(patch);
tmp.keySet().removeAll(target.keySet());
target.putAll(tmp);
これpatch
が、マップに追加するtarget
マップです。
Louis Wassermanのおかげで、Java8の新しいメソッドを利用するバージョンを次に示します。
patch.forEach(target::putIfAbsent);
patch.forEach(target::putIfAbsent)
。
使用グアバの地図あなたはそれがより多くのあなたが達成しようとしているものを明確にメソッドシグネチャで、単一の行でそれを行うことができます2つのマップの違いを計算するためにクラスのユーティリティメソッドを:
public static void main(final String[] args) {
// Create some maps
final Map<Integer, String> map1 = new HashMap<Integer, String>();
map1.put(1, "Hello");
map1.put(2, "There");
final Map<Integer, String> map2 = new HashMap<Integer, String>();
map2.put(2, "There");
map2.put(3, "is");
map2.put(4, "a");
map2.put(5, "bird");
// Add everything in map1 not in map2 to map2
map2.putAll(Maps.difference(map1, map2).entriesOnlyOnLeft());
}
繰り返して追加するだけです:
for(Map.Entry e : a.entrySet())
if(!b.containsKey(e.getKey())
b.put(e.getKey(), e.getValue());
編集して追加:
に変更を加えることができる場合は、次のこともできます。
a.putAll(b)
そして、あなたが必要なものを正確に持っているでしょう。(すべてのエントリではb
とのすべてのエントリa
に含まれていないことb
)
entrySet()
返しますSet<Map.Entry>
。2.)方法がないcontains(...)
ためjava.util.Map
。
@ericksonのソリューションでマップの順序を変更すると、1行で作成できます。
mapWithNotSoImportantValues.putAll( mapWithImportantValues );
この場合、mapWithNotSoImportantValuesの値を、同じキーを持つmapWithImportantValuesの値に置き換えます。
public class MyMap {
public static void main(String[] args) {
Map<String, String> map1 = new HashMap<String, String>();
map1.put("key1", "value1");
map1.put("key2", "value2");
map1.put("key3", "value3");
map1.put(null, null);
Map<String, String> map2 = new HashMap<String, String>();
map2.put("key4", "value4");
map2.put("key5", "value5");
map2.put("key6", "value6");
map2.put("key3", "replaced-value-of-key3-in-map2");
// used only if map1 can be changes/updates with the same keys present in map2.
map1.putAll(map2);
// use below if you are not supposed to modify the map1.
for (Map.Entry e : map2.entrySet())
if (!map1.containsKey(e.getKey()))
map1.put(e.getKey().toString(), e.getValue().toString());
System.out.println(map1);
}}
Java 8には、要件を満たすためのこのAPIメソッドがあります。
map.putIfAbsent(key, value)
指定されたキーがまだ値に関連付けられていない(またはnullにマップされている)場合は、指定された値に関連付けてnullを返します。それ以外の場合は、現在の値を返します。
他の人が言っているように、あなたは使うことができますputIfAbsent
。挿入するマップの各エントリを繰り返し処理し、元のマップでこのメソッドを呼び出します。
mapToInsert.forEach(originalMap::putIfAbsent);
removeAll
とにかくオーバーライドされるため、実行する必要はありません。