Muszę połączyć dwa zestawy ciągów, odfiltrowując zbędne informacje, to jest rozwiązanie, które wymyśliłem, czy jest lepszy sposób, który każdy może zasugerować? Może coś wbudowanego, co przeoczyłem? Nie miałem szczęścia z Google.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
i korzystaniem ze strumieni jest następująca: • używanieset1.addAll(set2)
będzie miało efekt uboczny polegający na fizycznej zmianie zawartościset1
. • Jednak użycie strumieni zawsze spowoduje, że nowe wystąpienie będzieSet
zawierało zawartość obu zestawów bez modyfikowania żadnej z oryginalnych instancji zestawu. IMHO ta odpowiedź jest lepsza, ponieważ pozwala uniknąć skutków ubocznych i potencjalnych nieoczekiwanych zmian w oryginalnym zestawie, gdyby miał być użyty w innym miejscu, oczekując oryginalnej zawartości. HTHTo samo z guawą :
źródło
Z definicji Zestaw zawiera tylko unikalne elementy.
Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet);
Aby ulepszyć swój kod, możesz stworzyć w tym celu ogólną metodę
public static <T> Set<T> distinct(Collection<T>... lists) { Set<T> distinct = new HashSet<T>(); for(Collection<T> list : lists) { distinct.addAll(list); } return distinct; }
źródło
Jeśli używasz guawy, możesz również użyć kreatora, aby uzyskać większą elastyczność:
ImmutableSet.<String>builder().addAll(someSet) .addAll(anotherSet) .add("A single string") .build();
źródło
Po prostu użyj
newStringSet.addAll(oldStringSet)
. Nie ma potrzeby sprawdzania duplikatów, ponieważSet
implementacja już to robi.źródło
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Ponieważ zestawy nie mogą mieć duplikatów, po prostu dodanie wszystkich elementów jednego do drugiego generuje poprawną sumę tych dwóch.
źródło
Spowoduje to utworzenie sumy s1 i s2
źródło
Użyj
boolean addAll(Collection<? extends E> c)
Dodaje wszystkie elementy w określonej kolekcji do tego zestawu, jeśli nie są one jeszcze obecne (operacja opcjonalna). Jeśli określona kolekcja jest również zbiorem, operacja addAll skutecznie modyfikuje ten zestaw, tak aby jego wartość była sumą dwóch zestawów. Zachowanie tej operacji jest niezdefiniowane, jeśli określona kolekcja zostanie zmodyfikowana w trakcie trwania operacji.
źródło
Jeśli zależy Ci na wydajności, a nie musisz trzymać swoich dwóch zestawów, a jeden z nich może być ogromny, proponuję sprawdzić, który zestaw jest największy i dodać elementy z najmniejszego.
Set<String> newStringSet = getNewStringSet(); Set<String> oldStringSet = getOldStringSet(); Set<String> myResult; if(oldStringSet.size() > newStringSet.size()){ oldStringSet.addAll(newStringSet); myResult = oldStringSet; } else{ newStringSet.addAll(oldStringSet); myResult = newStringSet; }
W ten sposób, jeśli twój nowy zestaw ma 10 elementów, a stary zestaw 100 000, wykonujesz tylko 10 operacji zamiast 100 000.
źródło
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Jeśli używasz Apache Common, użyj
SetUtils
klasy zorg.apache.commons.collections4.SetUtils;
źródło
SetView
, która jest niezmienna.Dodaje wszystkie elementy w określonej kolekcji do tego zestawu, jeśli nie są jeszcze obecne (operacja opcjonalna). Jeśli określona kolekcja jest również zbiorem, operacja addAll skutecznie modyfikuje ten zestaw, tak aby jego wartość była sumą dwóch zestawów
źródło