Saya ingin mengkonversi array untuk satu Set di Jawa. Ada beberapa cara yang jelas untuk melakukan hal ini (yaitu dengan loop) tapi aku ingin sesuatu yang sedikit lebih rapi, sesuatu seperti:
java.util.Arrays.asList(Object[] a);
Ada ide?
Seperti ini:
Set<T> mySet = new HashSet<>(Arrays.asList(someArray));
Di Jawa 9+, jika unmodifiable set ok:
Set<T> mySet = Set.of(someArray);
Di Jawa 10+, generik jenis parameter yang dapat disimpulkan dari array jenis komponen:
var mySet = Set.of(someArray);
Set<T> mySet = new HashSet<T>();
Collections.addAll(mySet, myArray);
Yang's Koleksi.addAll(jawa.util.Koleksi, T...) dari JDK 6.
Selain itu: bagaimana jika kami menginap penuh primitif?
Untuk JDK < 8, saya hanya akan menulis dengan jelas untuk
loop untuk melakukan bungkus dan add-to-set dalam satu lulus.
Untuk JDK >= 8, pilihan yang menarik adalah sesuatu seperti:
Arrays.stream(intArray).boxed().collect(Collectors.toSet());
Kami memiliki pilihan untuk menggunakan Aliran
juga. Kita bisa mendapatkan aliran dalam 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 dari Kolektor.toSet()
menunjukkan bahwa unsur-unsur yang ditambahkan satu per satu ke HashSet
tapi spesifikasi tidak menjamin itu akan menjadi HashSet
.
"tidak Ada jaminan pada jenis, berubah-ubah, serializability, atau thread-safety Set kembali."
Jadi lebih baik untuk menggunakan kemudian pilihan. Output adalah:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Jawa 9 diperkenalkan Set.dari
statis metode pabrik yang kembali berubah ditetapkan untuk memberikan unsur-unsur atau array.
@SafeVarargs
static <E> Set<E> of(E... elements)
Kita juga bisa mendapatkan berubah diatur dalam dua cara:
Set.copyOf(Array.sebagai daftar(array))
Array.stream(array).mengumpulkan(Kolektor.toUnmodifiableList());
Metode Kolektor.toUnmodifiableList()
secara internal menggunakan Set.dari
diperkenalkan di pulau Jawa 9. Juga memeriksa ini jawaban tambang untuk lebih lanjut.
Setelah anda melakukan Array.sebagai daftar(array)
anda dapat menjalankan Set = new HashSet(daftar);
Berikut ini adalah contoh metode, anda dapat menulis:
public <T> Set<T> GetSetFromArray(T[] array) {
return new HashSet<T>(Arrays.asList(array));
}
Di Eclipse Koleksi, berikut akan bekerja:
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 terima untuk Eclipse Koleksi
Dengan cepat : yang dapat anda lakukan :
// 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()]);
I've tertulis di bawah ini dari saran di atas mencuri itu... itu's nice!
/**
* 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't bekerja dengan array dari primitif (seperti int []
panjang, []
, char[]
, byte[]
, dll.)
Di Jawa 8 dan di atas, anda dapat kotak array dengan:
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Kemudian dikonversi untuk menggunakan stream:
Stream.of(boxedArr).collect(Collectors.toSet());
Kadang-kadang menggunakan beberapa standar perpustakaan membantu banyak. Cobalah untuk melihat Apache Commons Koleksi. Dalam hal ini masalah anda adalah hanya berubah untuk sesuatu seperti ini
String[] keys = {"blah", "blahblah"}
Set<String> myEmptySet = new HashSet<String>();
CollectionUtils.addAll(pythonKeywordSet, keys);
Dan berikut adalah CollectionsUtils javadoc
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());
output adalah
expected size is 3: 1
perubahan ini untuk
nobreaks.put(1, new HashSet(Arrays.asList( 2, 4, 5 )));
output adalah
expected size is 3: 3
Di Jawa 10:
String[] strs = {"A", "B"};
Set<String> set = Set.copyOf(Arrays.asList(strs));
Set.copyOf
kembali unmodifiable Set
yang mengandung unsur-unsur yang diberikan Koleksi
.
Yang diberikan Koleksi
tidak boleh null
, dan itu tidak harus mengandung null
elemen.
Gunakan CollectionUtils
atau ArrayUtils
dari stanford-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);