Ich muss zwei Zeichenfolgensätze kombinieren, während redundante Informationen herausgefiltert werden. Dies ist die Lösung, die ich mir ausgedacht habe. Gibt es einen besseren Weg, den jeder vorschlagen kann? Vielleicht etwas eingebaut, das ich übersehen habe? Hatte kein Glück mit Google.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
und der Verwendung von Streams besteht darin, dass • die Verwendungset1.addAll(set2)
den Nebeneffekt hat, dass der Inhalt von Streams physisch geändert wirdset1
. • Die Verwendung von Streams führt jedoch immer zu einer neuen Instanz,Set
die den Inhalt beider Sätze enthält, ohne eine der ursprünglichen Satzinstanzen zu ändern. IMHO ist diese Antwort besser, weil sie Nebenwirkungen und das Potenzial für unerwartete Änderungen am Originalset vermeidet, wenn es an anderer Stelle verwendet wird, während der ursprüngliche Inhalt erwartet wird. HTHDas gleiche gilt für Guave :
quelle
Aus der Definition enthält Set nur eindeutige Elemente.
Um Ihren Code zu verbessern, können Sie eine generische Methode dafür erstellen
quelle
Wenn Sie Guava verwenden, können Sie auch einen Builder verwenden, um mehr Flexibilität zu erhalten:
quelle
Einfach benutzen
newStringSet.addAll(oldStringSet)
. Sie müssen nicht nach Duplikaten suchen, da dieSet
Implementierung dies bereits tut.quelle
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Da Mengen keine Duplikate haben können, wird durch einfaches Hinzufügen aller Elemente des einen zum anderen die korrekte Vereinigung der beiden Elemente erzeugt.
quelle
Dies wird eine Union von s1 und s2 erzeugen
quelle
Verwendung
boolean addAll(Collection<? extends E> c)
Fügt diesem Satz alle Elemente in der angegebenen Auflistung hinzu, falls sie noch nicht vorhanden sind (optionaler Vorgang). Wenn die angegebene Auflistung auch eine Menge ist, ändert die Operation addAll diese Menge effektiv, sodass ihr Wert die Vereinigung der beiden Mengen ist. Das Verhalten dieser Operation ist undefiniert, wenn die angegebene Sammlung während der Operation geändert wird.
quelle
Wenn Sie Wert auf Leistung legen und Ihre beiden Sätze nicht behalten müssen und einer davon sehr groß sein kann, würde ich empfehlen, zu überprüfen, welcher Satz der größte ist, und die Elemente aus dem kleinsten hinzuzufügen.
Wenn Ihr neuer Satz 10 Elemente und Ihr alter Satz 100 000 enthält, führen Sie auf diese Weise nur 10 Operationen anstelle von 100 000 aus.
quelle
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Wenn Sie Apache Common verwenden, verwenden Sie
SetUtils
class fromorg.apache.commons.collections4.SetUtils;
quelle
SetView
unveränderliches a zurückgibt .Fügt diesem Satz alle Elemente in der angegebenen Auflistung hinzu, falls sie noch nicht vorhanden sind (optionaler Vorgang). Wenn die angegebene Auflistung auch eine Menge ist, ändert die Operation addAll diese Menge effektiv, sodass ihr Wert die Vereinigung der beiden Mengen ist
quelle