Saya perlu menggabungkan dua set string sambil menyaring informasi yang berlebihan, ini adalah solusi yang saya buat, adakah cara yang lebih baik yang dapat disarankan oleh siapa pun? Mungkin sesuatu yang dibangun di dalamnya saya abaikan? Tidak beruntung dengan google.
Set<String> oldStringSet = getOldStringSet();
Set<String> newStringSet = getNewStringSet();
for(String currentString : oldStringSet)
{
if (!newStringSet.contains(currentString))
{
newStringSet.add(currentString);
}
}
addAll
dan menggunakan Stream adalah: • menggunakanset1.addAll(set2)
akan memiliki efek samping mengubah konten secara fisikset1
. • Namun, menggunakan Streams akan selalu menghasilkan instance baru yangSet
berisi konten dari kedua set tanpa mengubah salah satu instance Set asli. IMHO jawaban ini lebih baik karena menghindari efek samping dan potensi perubahan tak terduga ke set asli jika itu akan digunakan di tempat lain sambil mengharapkan konten asli. HTHSama dengan Jambu Biji :
sumber
Dari definisi Set hanya berisi elemen unik.
Set<String> distinct = new HashSet<String>(); distinct.addAll(oldStringSet); distinct.addAll(newStringSet);
Untuk meningkatkan kode Anda, Anda dapat membuat metode umum untuk itu
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; }
sumber
Jika Anda menggunakan Guava, Anda juga dapat menggunakan builder untuk mendapatkan lebih banyak fleksibilitas:
ImmutableSet.<String>builder().addAll(someSet) .addAll(anotherSet) .add("A single string") .build();
sumber
Gunakan saja
newStringSet.addAll(oldStringSet)
. Tidak perlu memeriksa duplikat karenaSet
implementasi sudah melakukannya.sumber
http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#addAll(java.util.Collection )
Karena set tidak dapat memiliki duplikat, hanya menambahkan semua elemen dari satu ke lainnya akan menghasilkan gabungan yang benar dari keduanya.
sumber
Ini akan menghasilkan Union s1 dan s2
sumber
Gunakan
boolean addAll(Collection<? extends E> c)
Tambahkan semua elemen dalam koleksi yang ditentukan ke set ini jika mereka belum ada (operasi opsional). Jika koleksi yang ditentukan juga merupakan satu set, operasi addAll secara efektif mengubah set ini sehingga nilainya adalah gabungan dari dua set. Perilaku operasi ini tidak ditentukan jika koleksi yang ditentukan diubah saat operasi sedang berlangsung.
sumber
Jika Anda peduli dengan kinerja, dan jika Anda tidak perlu menyimpan dua set Anda dan salah satunya bisa sangat besar, saya sarankan untuk memeriksa set mana yang terbesar dan menambahkan elemen dari yang terkecil.
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; }
Dengan cara ini, jika set baru Anda memiliki 10 elemen dan set lama Anda memiliki 100.000, Anda hanya melakukan 10 operasi, bukan 100.000.
sumber
public boolean addAll(int index, Collection<? extends E> c, boolean checkSizes)
Jika Anda menggunakan Apache Common, gunakan
SetUtils
kelas dariorg.apache.commons.collections4.SetUtils;
sumber
SetView
, yang tidak dapat diubah.Menambahkan semua elemen dalam koleksi yang ditentukan ke set ini jika belum ada (operasi opsional). Jika koleksi yang ditentukan juga merupakan satu set, operasi addAll secara efektif mengubah set ini sehingga nilainya adalah gabungan dari dua set
sumber