web-gelistirme-sc.com

Diziden değişken listesi oluştur?

Dizinin içeriğini değiştirmek için bir List haline dönüştürmek istediğim bir dizilim var.

Yığın Taşması, Arrays.asList() adresini ve altta yatan dizinin yalnızca bir List görünümünü nasıl sağladığını ve sonuçta ortaya çıkan Listeyi nasıl değiştirmeyi denemenin genellikle listeyi işlemek için kullanılan yöntemler olarak bir UnsupportedOperationException atmasını (örneğin add(), remove(), vb.) Arrays.asList() tarafından sağlanan Liste uygulaması tarafından uygulanmadı.

Ancak bir dizinin değişken bir Listeye nasıl dönüştürüleceğine dair bir örnek bulamıyorum. Sanırım dizi ve put() her değeri yeni bir Listeye döndürebilirim, ama bunu yapmak için var olan bir arayüz olup olmadığını merak ediyorum.

56
ericsoco

Tek basit yol:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));

Bu değişken bir liste yaratacaktır - ancak orijinal dizinin bir kopyası olacaktır. Listeyi değiştirmek değil dizisini değiştirir. Elbette daha sonra toArray kullanarak kopyalayabilirsiniz.

Bir diziye değişken bir view oluşturmak istiyorsanız, bunu kendiniz uygulamak zorunda kalacağınıza inanıyorum.

88
Jon Skeet

Ve google koleksiyonu API'sini kullanıyorsanız

Lists.newArrayList(myArray)
13
vsingh

Java 8'de bulunan Stream API'sini kullanan bu basit kod, dizinizin öğelerini içeren değişken bir liste (veya görünüm) oluşturur:

Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));

Veya eşit olarak geçerli:

List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
5
MikaelF

Eclipse Collections (önceden GS Collections ) kullanıyorsanız, FastList.newListWith(...) veya FastList.wrapCopy(...) işlevlerini kullanabilirsiniz.

Her iki yöntem de varargs alır, böylece satır içi diziyi oluşturabilir veya varolan bir diziye geçebilirsiniz.

MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);

İki yöntem arasındaki fark, dizinin kopyalanıp kopyalanmamasıdır. newListWith() diziyi kopyalamaz ve bu nedenle sabit zaman alır. Dizinin başka bir yerde değişebileceğini biliyorsanız, kullanmaktan kaçınmalısınız.

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);

Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);

Not: Eclipse Koleksiyonlar için bir vericiyim.

4
Craig P. Motlin

Streams API kullanarak başka bir seçenek ekleme:

List<Foo> list = Arrays.stream(array).collect(Collectors.toList());
0
Sahil Chhabra
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
0
Sid