Saya ingin mengonversi array ke Set di Java. Ada beberapa cara yang jelas untuk melakukan ini (yaitu dengan loop) tetapi saya ingin sesuatu yang sedikit lebih rapi, seperti:
java.util.Arrays.asList(Object[] a);
Ada ide?
Saya ingin mengonversi array ke Set di Java. Ada beberapa cara yang jelas untuk melakukan ini (yaitu dengan loop) tetapi saya ingin sesuatu yang sedikit lebih rapi, seperti:
java.util.Arrays.asList(Object[] a);
Ada ide?
Jawaban:
Seperti ini:
Set<T> mySet = new HashSet<>(Arrays.asList(someArray));
Di Java 9+, jika set yang tidak dapat dimodifikasi ok:
Set<T> mySet = Set.of(someArray);
Dalam Java 10+, parameter tipe generik dapat disimpulkan dari tipe komponen array:
var mySet = Set.of(someArray);
Arrays.asListadalah O (1).
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);
Itu adalah Collections.addAll (java.util.Collection, T ...) dari JDK 6.
Selain itu: bagaimana jika array kami penuh dengan primitif?
Untuk JDK <8, saya hanya akan menulis forloop yang jelas untuk melakukan wrap dan add-to-set dalam satu pass.
Untuk JDK> = 8, opsi yang menarik adalah sesuatu seperti:
Arrays.stream(intArray).boxed().collect(Collectors.toSet());
java.util.Collections.addAll. Plus, saya tidak akan merekomendasikan Commons Collections lagi, apa yang tidak dibuat dan Guava ada
addAllakan menjadi O ( n ).
Dengan Jambu Biji, Anda bisa melakukannya:
T[] array = ...
Set<T> set = Sets.newHashSet(array);
new HashSet<T>(Arrays.asList(someArray)). Lihat google.github.io/guava/releases/19.0/api/docs/com/google/common/…
Java 8:
String[] strArray = {"eins", "zwei", "drei", "vier"};
Set<String> strSet = Arrays.stream(strArray).collect(Collectors.toSet());
System.out.println(strSet);
// [eins, vier, zwei, drei]
Kami memiliki opsi untuk menggunakan Streamjuga. Kita bisa mendapatkan streaming dengan berbagai cara:
Set<String> set = Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));
System.out.println(set);
String[] stringArray = {"A", "B", "C", "D"};
Set<String> strSet1 = Arrays.stream(stringArray).collect(Collectors.toSet());
System.out.println(strSet1);
// if you need HashSet then use below option.
Set<String> strSet2 = Arrays.stream(stringArray).collect(Collectors.toCollection(HashSet::new));
System.out.println(strSet2);
Kode sumber Collectors.toSet()menunjukkan bahwa elemen ditambahkan satu per satu ke HashSettetapi spesifikasi tidak menjamin itu akan menjadi HashSet.
"Tidak ada jaminan pada jenis, mutabilitas, serializability, atau keamanan ulir dari Set yang dikembalikan."
Jadi lebih baik menggunakan opsi nanti. Outputnya adalah:
[A, B, C, D]
[A, B, C, D]
[A, B, C, D]
Java 9 memperkenalkan Set.ofmetode pabrik statis yang mengembalikan set tetap untuk elemen yang disediakan atau array.
@SafeVarargs
static <E> Set<E> of(E... elements)
Periksa Metode Pabrik Statis Tidak Berubah untuk detailnya.
Kita juga bisa mendapatkan perangkat permanen dengan dua cara:
Set.copyOf(Arrays.asList(array))Arrays.stream(array).collect(Collectors.toUnmodifiableList());Metode ini secara Collectors.toUnmodifiableList()internal menggunakan Set.ofdiperkenalkan di Jawa 9. Juga periksa jawaban saya ini untuk lebih.
Stream.of()- Saya tidak tahu itu. Sebuah pertengkaran kecil tentang Collectors.toSet(): Anda mengatakan spec tidak menjamin penambahan elemen satu per satu, tapi itulah artinya dengan: "mengakumulasi ... menjadi yang baru Set". Dan itu lebih mudah dibaca - jadi lebih disukai bagi saya, jika Anda tidak memerlukan jaminan jenis konkret, mutabilitas, serializability dan keamanan thread.
HashSet. Itu hanya menjamin bahwa itu akan menjadi Setdan itu yang saya maksud. Semoga saya klarifikasi.
Setelah Anda melakukannya, Arrays.asList(array)Anda dapat menjalankanSet set = new HashSet(list);
Berikut adalah contoh metode, Anda dapat menulis:
public <T> Set<T> GetSetFromArray(T[] array) {
return new HashSet<T>(Arrays.asList(array));
}
Di Eclipse Collections , yang berikut ini akan berfungsi:
Set<Integer> set1 = Sets.mutable.of(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.mutable.of(new Integer[]{1, 2, 3, 4, 5});
MutableSet<Integer> mutableSet = Sets.mutable.of(1, 2, 3, 4, 5);
ImmutableSet<Integer> immutableSet = Sets.immutable.of(1, 2, 3, 4, 5);
Set<Integer> unmodifiableSet = Sets.mutable.of(1, 2, 3, 4, 5).asUnmodifiable();
Set<Integer> synchronizedSet = Sets.mutable.of(1, 2, 3, 4, 5).asSynchronized();
ImmutableSet<Integer> immutableSet = Sets.mutable.of(1, 2, 3, 4, 5).toImmutable();
Catatan: Saya pengendara untuk Eclipse Collections
Dengan cepat: Anda dapat melakukan:
// Fixed-size list
List list = Arrays.asList(array);
// Growable list
list = new LinkedList(Arrays.asList(array));
// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));
dan untuk membalikkan
// Create an array containing the elements in a list
Object[] objectArray = list.toArray();
MyClass[] array = (MyClass[])list.toArray(new MyClass[list.size()]);
// Create an array containing the elements in a set
objectArray = set.toArray();
array = (MyClass[])set.toArray(new MyClass[set.size()]);
Saya telah menulis di bawah ini dari saran di atas - mencurinya ... itu bagus!
/**
* Handy conversion to set
*/
public class SetUtil {
/**
* Convert some items to a set
* @param items items
* @param <T> works on any type
* @return a hash set of the input items
*/
public static <T> Set<T> asSet(T ... items) {
return Stream.of(items).collect(Collectors.toSet());
}
}
Telah ada banyak jawaban yang besar sudah, tapi kebanyakan dari mereka tidak akan bekerja dengan array primitif (seperti int[], long[], char[], byte[], dll)
Di Java 8 dan di atas, Anda bisa mengotak array dengan:
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Kemudian konversi untuk diatur menggunakan aliran:
Stream.of(boxedArr).collect(Collectors.toSet());
Kadang menggunakan beberapa perpustakaan standar banyak membantu. Cobalah untuk melihat Koleksi Apache Commons . Dalam hal ini masalah Anda hanya ditransformasikan menjadi sesuatu seperti ini
String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);
Dan di sini adalah javadoc CollectionsUtils
java.util.Collections.addAll(myEmptySet, keys);??
Gunakan CollectionUtilsatau ArrayUtilsdaristanford-postagger-3.0.jar
import static edu.stanford.nlp.util.ArrayUtils.asSet;
or
import static edu.stanford.nlp.util.CollectionUtils.asSet;
...
String [] array = {"1", "q"};
Set<String> trackIds = asSet(array);
Di Jawa 10 :
String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));
Set.copyOfmengembalikan yang tidak dapat dimodifikasi yang Setmengandung unsur-unsur yang diberikan Collection.
Yang diberikan Collectiontidak boleh null, dan tidak boleh mengandung nullelemen apa pun .
private Map<Integer, Set<Integer>> nobreaks = new HashMap();
nobreaks.put(1, new HashSet(Arrays.asList(new int[]{2, 4, 5})));
System.out.println("expected size is 3: " +nobreaks.get(1).size());
outputnya adalah
expected size is 3: 1
ubah ke
nobreaks.put(1, new HashSet(Arrays.asList( 2, 4, 5 )));
outputnya adalah
expected size is 3: 3
Bagi siapa pun yang memecahkan untuk Android:
Tanda bintang *adalah spreadoperator. Itu berlaku semua elemen dalam koleksi secara individual, masing-masing diteruskan untuk varargparameter metode. Itu sama dengan:
val myArray = arrayOf("data", "foo")
val mySet = setOf(*myArray)
// Equivalent to
val mySet = setOf("data", "foo")
// Multiple spreads ["data", "foo", "bar", "data", "foo"]
val mySet = setOf(*myArray, "bar", *myArray)
Melewati tanpa parameter setOf()menghasilkan set kosong.
Selain itu setOf, Anda juga dapat menggunakan semua ini untuk jenis hash tertentu:
hashSetOf()
linkedSetOf()
mutableSetOf()
sortableSetOf()
Ini adalah cara mendefinisikan jenis item koleksi secara eksplisit.
setOf<String>()
hashSetOf<MyClass>()
new HashSet<Object>(Arrays.asList(Object[] a));
Tapi saya pikir ini akan lebih efisien:
final Set s = new HashSet<Object>();
for (Object o : a) { s.add(o); }
HashSetdiatur berdasarkan ukuran array, misalnya.
Set<T> b = new HashSet<>(Arrays.asList(requiredArray));