@erickson eine viel kompaktere Java 8-Version: patch.forEach(target::putIfAbsent).
– Louis Wassermann
5. Januar 2016 um 20:08 Uhr
Verwenden Guave‘s Karten -Klasse’-Utility-Methoden zum Berechnen der Differenz von 2 Karten können Sie dies in einer einzigen Zeile tun, mit einer Methodensignatur, die deutlicher macht, was Sie erreichen möchten:
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());
}
Reverend Gonzo
Iteriere einfach und füge hinzu:
for(Map.Entry e : a.entrySet())
if(!b.containsKey(e.getKey())
b.put(e.getKey(), e.getValue());
Bearbeiten, um hinzuzufügen:
Wenn Sie Änderungen an a vornehmen können, können Sie auch Folgendes tun:
a.putAll(b)
und a wird genau das haben, was Sie brauchen. (alle Einträge in b und alle Einträge in a die sind nicht drin b)
1.) entrySet() gibt a zurück Set<Map.Entry>. 2.) Es gibt keine Methode contains(...)zum java.util.Map.
– Fabian Barney
25. August 2011 um 17:39 Uhr
Gibt es keinen klügeren Weg? Wie ein Sammlungsdienstprogramm oder so? Ich hasse all die for-Schleifen überall.
– Rapadura
25. August 2011 um 17:39 Uhr
@AntonioP: Alle for-Schleifen überall? Es gibt eine for-Schleife und sie ist so einfach wie möglich.
– Reverend Gonzo
25. August 2011 um 17:44 Uhr
+1 funktioniert dann nur, wenn Karten nicht mit Rohtyp verwendet werden, denke ich. Habe mich ein bisschen mit dem Map.Entry beschäftigt 🙂
– Fabian Barney
25. August 2011 um 17:50 Uhr
@Reverend Gonzo, ah, an anderer Stelle im Code. 🙂 Ersetzt .putAll nicht vorhandene Schlüssel und Werte von a? Ich werde mit diesem Sinn gehen, es scheint der einfachste Weg zu sein.
– Rapadura
25. August 2011 um 18:24 Uhr
Sie können es in nur einer Zeile schaffen, wenn Sie die Kartenreihenfolge in @ericksons Lösung ändern:
In diesem Fall ersetzen Sie Werte in mapWithNotSoImportantValues durch Werte aus mapWithImportantValues mit denselben Schlüsseln.
Niklas Charalambidis
Java 8-Lösung verwenden Map#merge
Ab Java-8 können Sie verwenden Map#merge(K key, V value, BiFunction remappingFunction) die einen Wert in die verschmilzt Map verwenden remappingFunction falls der Schlüssel bereits in der gefunden wird Map Sie möchten das Paar einsetzen.
// using for-loop
for (Map.Entry<Integer, String> entry: newMap.entrySet()) {
map.merge(entry.getKey(), entry.getValue(), (oldValue, newValue) -> oldValue);
}
Der Code iteriert die newMap Einträge (key und value) und jeder wird zusammengeführt map durch die Methode merge. Das remappingFunction wird im Falle eines duplizierten Schlüssels ausgelöst und in diesem Fall heißt es, dass der erstere (Original) oldValue Der Wert wird verwendet und nicht umgeschrieben.
Mit dieser Lösung benötigen Sie kein Provisorium Map.
Lassen Sie uns ein Beispiel für das Zusammenführen haben newMap Einträge in map und Beibehalten der ursprünglichen Werte im Falle des duplizierten Eintrags.
Map<Integer, String> newMap = new HashMap<>();
newMap.put(2, "EVIL VALUE"); // this will NOT be merged into
newMap.put(4, "four"); // this WILL be merged into
newMap.put(5, "five"); // this WILL be merged into
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
newMap.forEach((k, v) -> map.merge(k, v, (oldValue, newValue) -> oldValue));
map.forEach((k, v) -> System.out.println(k + " " + v));
1 one
2 two
3 three
4 four
5 five
Jajikanth pydimarla
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);
}}
neuer Tag
Mit Java 8 gibt es diese API-Methode, um Ihre Anforderung zu erfüllen.
map.putIfAbsent(key, value)
Wenn der angegebene Schlüssel nicht bereits einem Wert zugeordnet ist (oder auf null abgebildet ist), wird er dem angegebenen Wert zugeordnet und null zurückgegeben, andernfalls wird der aktuelle Wert zurückgegeben.
können wir putAllIfAbsent haben? das ist was ich brauche ?
– Benutzer1735921
20. September 2018 um 10:40 Uhr
12516900cookie-checkWie kann man All auf Java HashMap-Inhalte von einem zum anderen setzen, aber vorhandene Schlüssel und Werte nicht ersetzen?yes