Dizidən bir ArrayList yaradın

Aşağıdakı kimi başlayan bir sıra var:

 Element[] array = {new Element(1), new Element(2), new Element(3)}; 

Bu diziyi ArrayList sınıfının bir obyektinə çevirmək istərdim.

 ArrayList<Element> arraylist = ???; 
3165
01 окт. Ron Tuffin tərəfindən 01 oktyabr tarixində təyin olundu 2008-10-01 17:38 '08 at 17:38 2008-10-01 17:38
@ 35 cavab
  • 1
  • 2
 new ArrayList<>(Arrays.asList(array)) 
4174
01 окт. 01 oktyabrda Tomə cavab verin 2008-10-01 17:39 '08 saat 17:39 'da 2008-10-01 17:39

Verilənlər:

 Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) }; 

Ən asan cavab:

border=0
 List<Element> list = Arrays.asList(array); 

Bu yaxşı işləyəcək. Bəzi qeydlər:

  • AsList-dən dönən siyahı sabit bir ölçüsü var . Beləliklə, ArrayList qaytarılmış siyahıdan maddələr əlavə etmək və ya silmək ArrayList onu yeni bir ArrayList . Əks halda, Siz UnsupportedOperationException alacaqsınız.
  • asList() -dan asList() siyahı mənbə array tərəfindən saxlanılır. Kaynak dizisini dəyişdirirsinizsə, siyahı da dəyişdiriləcəkdir. Bu gözəl ola bilər.
811
01 окт. Alex Miller tərəfindən verilmiş cavab Oct 01 2008-10-01 18:39 '08 at 18:39 2008-10-01 18:39

(köhnə mövzu, yalnız 2 qəpik, çünki Guava və ya digər kitabxanalar və digər məlumatlar heç kimə aid deyil)

Əgər edə bilərsiniz, Guava istifadə edin.

Guava'nın yolunu qeyd etmək lazımdır ki, bu da bu saxtakarlıqları çox asanlaşdırır:

İstifadə

Değişmeyen siyahısı üçün

ImmutableListof()copyOf() standart üsullarını (elementlər boş ola bilməz) istifadə edin :

 List<String> il = ImmutableList.of("string", "elements"); // from varargs List<String> il = ImmutableList.copyOf(aStringArray); // from array 

Mutable siyahısı üçün

Lists və onun newArrayList() fabrikini istifadə edin:

 List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection List<String> l2 = Lists.newArrayList(aStringArray); // from array List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs 

Digər siniflərdə, məsələn, Sets də digər məlumat strukturları üçün oxşar metodları qeyd edin.

Niyə Guava?

Əsas cəlb, tipi təhlükəsizliyə görə generics səbəbiylə karmaşalığı azaltmaq ola bilər, çünki Guava zavod üsullarından istifadə çox vaxt törədilməlidir növlərə imkan verir. Ancaq Java 7 yeni bir almaz operatoru ilə gəldiyi üçün bu arqument daha az su ehtiva edir.

Lakin bu tək səbəb deyildir (və Java 7 hər yerdə deyil): qısaldılmış sintaksis də çox rahatdır və yuxarıda gördüyünüz kimi metod başlanğıcları daha ifadəli kod yazmağa imkan verir. Mövcud Java koleksiyasından 2 ədəd götürən bir Guava çağırışında edirsiniz.


Mümkün deyilsə ...

Değişmeyen siyahısı üçün

Collections.unmodifiableList() tərəfindən sarılan JDK sinif ArraysasList() fabrikasını istifadə edin:

 List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements)); List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2")); 

Qeyd edək ki, asList() üçün qaytarma növü asList() konkret tətbiqini istifadə edərək, ArrayList , lakin java.util.ArrayList deyil . Bu, bir ArrayList emule edən daxili bir ArrayList , amma əslində birbaşa qəbul edilmiş ArrayList istinad edir və "yazmaq" üçün səbəb olur (dəyişikliklər ArrayList əks olunur).

Sadə AbstractList uzantısı ilə bəzi API List üsulları ilə dəyişiklikləri qadağan edir (bu səbəbdən elementləri əlavə etmək və ya aradan qaldırmaq dəstəklənmir), lakin elementləri yenidən təyin etmək üçün set() çağırışlarına imkan verir. Beləliklə, bu siyahı həqiqətən dəyişməzdir və asList() üçün asList() Collections.unmodifiableList() tərəfindən bükülmüş olmalıdır.

Əgər dəyişdirilmiş siyahıya ehtiyac duyarsanız növbəti addımı baxın.

Değişken siyahısı üçün

Yuxarıda olduğu kimi, ancaq java.util.ArrayList bükülmüşdür:

 List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6 List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+ List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6 List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+ 

Təlim məqsədləri üçün: doğru yol

 // for Java 1.5+ static <T> List<T> arrayToList(final T[] array) { final List<T> l = new ArrayList<T>(array.length); for (final T s : array) { l.add(s); } return (l); } // for Java < 1.5 (no generics, no compile-time type-safety, boo!) static List arrayToList(final Object[] array) { final List l = new ArrayList(array.length); for (int i = 0; i < array.length; i++) { l.add(array[i]); } return (l); } 
310
16 нояб. Cavab 16 Noyabr tarixində verilir 2012-11-16 20:16 '12 at 8:16 pm 2012-11-16 20:16

Bu sual olduqca köhnə olduğundan, heç kəsin ən sadə formasını təklif etmədiyi məni şaşırttı:

 List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3)); 

Java 5-də başlayaraq, Arrays.asList() bir varargs parametri alır və açıq bir sıra yaratmaq lazım deyil.

208
22 июня '11 в 14:30 2011-06-22 14:30 Cavab Tim Büthe tərəfindən 22 İyun, '11 'də saat 14:30' də verilir. 2011-06-22 14:30
 new ArrayList<T>(Arrays.asList(myArray)); 

myArray T kimi eyni tip olduğuna əmin olun. Məsələn, bir List<Integer> bir int List<Integer> bir List<Integer> yaratmağa çalışarsanız kompilyator səhvi alacaqsınız.

180
01 окт. Bill Lizard tərəfindən verilmiş cavab Oct 01 2008-10-01 17:40 '08 saat 17:40 'da 2008-10-01 17:40

Başqa bir yol (əsasən, new ArrayList(Arrays.asList(array)) həllinin nəticəsinə bərabərdir new ArrayList(Arrays.asList(array)) :

 Collections.addAll(arraylist, array); 
82
04 апр. Cavab Peter Tseng tərəfindən verilir 04 Apr. 2012-04-04 02:20 '12 at 2:20 2012-04-04 02:20

Java 9

Java 9-da, List.of literal yaratmaq üçün List.of statik fabrikindən istifadə edə bilərsiniz. Aşağıdakı kimi bir şey:

 List<Element> elements = List.of(new Element(1), new Element(2), new Element(3)); 

Bu, üç maddə olan dəyişməz bir siyahısı qaytaracaq. Değiştirilmiş bir listeye ehtiyacınız varsa, bu siyahısı ArrayList konstruktoruna ArrayList :

 new ArrayList<>(List.of(// elements vararg)) 

JEP 269: Gübrə Fabrikası Koleksiyonlara Yönelik Yöntemler

JEP 269 Java Collections API üçün bəzi rahat fabrik üsulları təqdim edir. Bu statik statik zavod üsulları Java, 9 və daha sonra List , SetMap interfeyslərinə daxil edilir.

71
17 апр. Əli Dehqani tərəfindən verilmiş cavab 17 aprel 2016-04-17 19:58 '16 at 7:58 pm 2016-04-17 19:58

Yəqin ki, yalnız bir siyahısı lazımdır, bir ArrayList deyil. Bu halda, sadəcə:

 List<Element> arraylist = Arrays.asList(array); 
65
01 окт. Cavab Kip Oct 01. 2008-10-01 17:45 '08, 5:45 pm 2008-10-01 17:45

2014-cü ildə demək olar ki, başa çatan başqa bir yeniləmə də Java 8 istifadə edərək bunu da edə bilərsiniz:

 ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new)); 

Bir siyahı ola bilər, əgər bir neçə simvol List

 List<Element> list = Stream.of(myArray).collect(Collectors.toList()); 
56
25 нояб. cavab niyə verilir 25 noyabr. 2014-11-25 23:48 '14 at 11:48 2014-11-25 23:48

ArrayList bir sıra çevirmək üçün, developers tez-tez bunu:

 List<String> list = Arrays.asList(arr);// this is wrong way.. 

Arrays.asList() private static class inside Arrays olan bir ArrayList'i qaytarır. Array java.util.ArrayList sinfi deyil. The java.util.Arrays.ArrayList sınıfı set(), get(), contains() üsulları set(), get(), contains() , lakin elementləri əlavə etmək üçün heç bir üsul yoxdur, beləliklə onun ölçüsü sabitdir. Real ArrayList yaratmaq üçün bunu etməlisiniz:

 ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr)); 

The ArrayList constructor java.util.Arrays.ArrayList üçün də super növü olan bir Collection Tipi qəbul edə bilər java.util.Arrays.ArrayList

49
25 июня '14 в 10:20 2014-06-25 10:20 cavab 25 İyun 2014 tarixində saat 10:20 da Xar E Ahmer tərəfindən verilir

Əgər istifadə edirsinizsə:

 new ArrayList<T>(Arrays.asList(myArray)); 

İki siyahı yarada və doldurun ! Böyük bir siyahı iki dəfə doldurmaq, istəmədiyiniz şeydir. Çünki bant genişliyi artırmaq üçün hər dəfə başqa bir Object[] array yaradır.

Xoşbəxtlikdən, JDK tətbiqi sürətli və Arrays.asList(a[]) çox yaxşıdır. ArrayList adlı ArrayList adlı bir növ yaradır. Object [] məlumatları birbaşa bir sıra vurğulayır.

 // in Arrays @SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } //still in Arrays, creating a private unseen class private static class ArrayList<E> private final E[] a; ArrayList(E[] array) { a = array; // you point to the previous array } .... } 

Təhlükəli tərəf , ilk sıra dəyişdirdiyiniz təqdirdə, siyahısı dəyişirsiniz! . Bunu istəmisinizmi? Bəlkə də bəli, bəlkə deyil.

Əgər deyilsə, ən aydın şəkildə aşağıdakılardır:

 ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity for (Element element : myArray) { list.add(element); } 

Və ya, @glglgl'de göstərildiyi kimi, başqa bir müstəqil ArrayList yaratmaq olar:

 new ArrayList<T>(Arrays.asList(myArray)); 

Collections , Arrays və ya Guava'yı istifadə etmək istəyirəm. Amma uyğun deyilsə və ya hiss etmirsinizsə, başqa cür bir xətt yazmayın.

31
18 янв. Cavab Nicolas Zozol tərəfindən verilir 18 yanvar. 2014-01-18 16:01 '14 saat 16:01 2014-01-18 16:01

Java 9 istifadə edə bilərsiniz:

 List<String> list = List.of("Hello", "World", "from", "Java"); List<Integer> list = List.of(1, 2, 3, 4, 5); 
28
11 апр. Cavab MarekM 11 apr verilir . 2017-04-11 15:20 '17 da 15:20 2017-04-11 15:20

Cavab cavanına uyğun olaraq java 1.7:

 ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array)); 

Ancaq interface istifadə etmək həmişə yaxşıdır:

 List<Element> arraylist = Arrays.<Element>asList(array); 
25
18 мая '15 в 1:07 2015-05-18 01:07 Cavab nekperu15739 18 May '15 'də 1:07' də verilir 2015-05-18 01:07
 // Guava import com.google.common.collect.ListsLists ... List<String> list = Lists.newArrayList(aStringArray); 
21
07 янв. Bohdan 07 yanvar cavab verdi 2014-01-07 09:04 '14 at 09:04 2014-01-07 09:04

Müxtəlif üsullardan istifadə edə bilərsiniz.

  • List<Element> list = Arrays.asList(array);

  • List<Element> list = new ArrayList();
    Collections.addAll(list, array);

  • Arraylist list = new Arraylist();
    list.addAll(Arrays.asList(array));

Daha ətraflı məlumat üçün http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html ünvanına müraciət edə bilərsiniz.

17
02 мая '16 в 11:40 2016-05-02 11:40 cavab oxy_js 02 May '16 saat 11:40 2016-05-02 11:40 verilir

Çünki Java 8-ə çevirmək üçün daha asan bir yol var:

 public static <T> List<T> fromArray(T[] array) { return Arrays.stream(array).collect(toList()); } 
14
23 дек. Cavab 23 dekabrda Andrii Abramov tərəfindən verilir. 2016-12-23 15:31 '16 'da saat 15:31' də 2016-12-23 15:31

Bunu Java 8-də bir stream ilə edə bilərsiniz.

  List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 
13
06 февр. Cavab verildi 06 feb . 2016-02-06 11:56 '16 'da 11:56 2016-02-06 11:56

hər kəs bunu edəcəyini söylədi

  new ArrayList<>(Arrays.asList("1","2","3","4")); 

və bir sıra yaratmaq üçün ən yaygın yeni yol - müşahidə edilə bilən diziler

GözlənilənList: dinləyicilərin meydana gəldikdə dəyişiklikləri izləmək üçün imkan verən bir siyahı.

Java SE üçün cəhd edə bilərsiniz

 FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3)); 

bu Oracle Sənədlərinə görədir

observableArrayList () Arraylist tərəfindən dəstəklənən yeni bir boş siyahı siyahısını yaradır. observableArrayList (E ... maddələr) əlavə maddələr ilə nəzarət olunan dizilərin yeni siyahısını yaradır.

Java 9 yeniləmə

java 9 da bu bir az asan:

 List<String> list = List.of("element 1", "element 2", "element 3"); 
12
05 янв. Cavab verilir Abojemyeg 05 yanvar. 2017-01-05 21:32 '17 saat 21:32 'də 2017-01-05 21:32
  • Arrays.asList() metodunun Arrays.asList() , bu kimi bir şey alacaqsınız:

      public static <T> List<T> asList(T... a) //varargs are of T type. 

    Beləliklə, arraylist aşağıdakı kimi arraylist bilərsiniz:

      List<Element> arraylist = Arrays.asList(new Element(1),new Element(2),new Element(3)); 

    Qeyd : Hər bir new Element(int args) ayrı bir obyekt kimi qəbul ediləcək və var-args kimi ötürülə bilər.

  • Bu suala başqa cavab verilə bilər.
    java.util.Collections.addAll() metodu üçün bir bəyanat görürsənsə, bu kimi bir şey əldə edəcəksiniz:

     public static <T> boolean addAll(Collection<? super T> c, T... a); 

    Buna görə də bu kod bunun üçün də faydalıdır.

     Collections.addAll(arraylist, array); 
10
30 марта '16 в 9:48 2016-03-30 09:48 Cavab Vikrang Kashyap tərəfindən 30 Mart 'da 9:48' də 2016-03-30 09:48 'də verilir

Başqa bir sadə yol bütün elementləri bir arraydan hər bir formanı istifadə edərək yeni ArrayList-ə əlavə etməkdir.

 ArrayList<Element> list = new ArrayList<>(); for(Element e : array) list.add(e); 
8
16 дек. Cavab spencer.sm tərəfindən verilir 16 Dekabr. 2015-12-16 23:32 '15 'da 23:32' de, 2015-12-16 23:32

Serialın ibtidai bir növü varsa, bu cavablar işləməyəcəkdir. Amma Java 8 ilə istifadə edə bilərsiniz:

 int[] array = new int[5]; Arrays.stream(array).boxed().collect(Collectors.toList()); 
6
10 июля '17 в 5:21 2017-07-10 05:21 cavab 10 İyul '17' də 5:21 2017-07-10 05:21 'də verilir

Verilənlər:

 Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) }; 

İstifadə edin:

 List<Element> listArray = Arrays.asList(array); 
5
22 апр. Cavab Lakshan tərəfindən 22 apreldə verilir 2017-04-22 06:53 '17 da 6:53 2017-04-22 06:53 'də

Bu suala çox gözəl cavablar verildiyinə baxmayaraq öz materiallarımı əlavə edəcəyəm.

Element[] array = { new Element(1), new Element(2), new Element(3) };

Yeni bir ArrayList aşağıdakı yollarla yaradıla bilər.

 ArrayList<Element> arraylist_1 = new ArrayList<>(Arrays.asList(array)); ArrayList<Element> arraylist_2 = new ArrayList<>( Arrays.asList(new Element[] { new Element(1), new Element(2), new Element(3) })); // Add through a collection ArrayList<Element> arraylist_3 = new ArrayList<>(); Collections.addAll(arraylist_3, array); 

Və bütün ArrayList əməliyyatlarını çox yaxşı dəstəkləyir.

 arraylist_1.add(new Element(4)); // or remove(): Success arraylist_2.add(new Element(4)); // or remove(): Success arraylist_3.add(new Element(4)); // or remove(): Success 

Lakin aşağıdakı əməliyyatlar yalnız ArrayList üçün siyahısı görünüşünü qaytarır, faktiki ArrayList deyil.

 // Returns a List view of array and not actual ArrayList List<Element> listView_1 = (List<Element>) Arrays.asList(array); List<Element> listView_2 = Arrays.asList(array); List<Element> listView_3 = Arrays.asList(new Element(1), new Element(2), new Element(3)); 

Buna görə, ArrayList ilə bəzi əməliyyatları yerinə yetirmək istəyərkən səhv verəcəklər

 listView_1.add(new Element(4)); // Error listView_2.add(new Element(4)); // Error listView_3.add(new Element(4)); // Error 

Array siyahısı görünüşü haqqında daha çox oxuyun.

4
07 апр. Devendra Lattu tərəfindən verilmiş cavab 07 Apr 2017-04-07 21:45 '17 saat 21:45 'də 2017-04-07 21:45

Bunu java 8-də aşağıdakı kimi edə bilərsiniz

 ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList()); 
3
07 июня '17 в 15:14 2017-06-07 15:14 Cavab Adit A. Pillai tərəfindən 07 İyun '17 'də 15:14 2017-06-07 15:14' də verilir

Bunu asanlıqla Arrays.asList (arrayObj) array ilə edə bilərsiniz;

 Element[] array = {new Element(1), new Element(2), new Element(3)}; ArrayList<Element> arraylist =Arrays.asList(array); 
3
26 окт. Cavab İbrahim Şaik 26 oktyabr verilir . 2018-10-26 17:38 '18 'də saat 17:38' də 2018-10-26 17:38 'də

ArrayList elementlərinə bir sıra çevirmək üçün aşağıdakı kodu istifadə edin.

 Element[] array = {new Element(1), new Element(2), new Element(3)}; ArrayList<Element>elementArray=new ArrayList(); for(int i=0;i<array.length;i++) { elementArray.add(array[i]); } 
3
03 дек. TG Kavinda Pushpitha tərəfindən verilmiş cavab 03 Dek 2018-12-03 14:32 '18 saat 02:32 'da 2018-12-03 14:32

Biz asanlıqla bir ArrayList bir sıra çevirə bilərsiniz. Bir addAll() məzmunu kopyalamaq üçün addAll() interfeysinin addAll() metodundan istifadə edirik.

  Arraylist arr = new Arraylist(); arr.addAll(Arrays.asList(asset)); 
3
04 июля '17 в 10:22 2017-07-04 10:22 cavab 04 avqust '17 'də saat 10:22' də veriləcək

Bunu etmək üçün ən asan üsul aşağıdakı kodu əlavə etməkdir. Təcrübəli və sınaqdan keçirildi.

 String[] Array1={"one","two","three"}; ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1)); 
3
03 мая '17 в 11:38 2017-05-03 11:38 Cavab Hemin 03 May '17 'də 11:38 2017-05-05 11:38' ye verilir

Başqa bir Java8 həlli (böyük bir toplama arasına cavabını buraxmış ola bilərəm, əgər bəli, üzr istəmirəm). Bu, bir ArrayList yaradır (bir siyahıya fərqli olaraq), yəni öğeleri silə bilərsiniz

 package package org.something.util; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Junk { static <T> ArrayList<T> arrToArrayList(T[] arr){ return Arrays.asList(arr) .stream() .collect(Collectors.toCollection(ArrayList::new)); } public static void main(String[] args) { String[] sArr = new String[]{"Hello", "cruel", "world"}; List<String> ret = arrToArrayList(sArr); // Verify one can remove an item and print list to verify so ret.remove(1); ret.stream() .forEach(System.out::println); } } 

Çıx ... Salam dünya

3
20 июня '17 в 11:33 2017-06-20 11:33 cavab 20 mart '17 'də, 11:33' də 2017-06-20 11:33 'də verilir

Hər kəs artıq probleminiz üçün kifayət qədər yaxşı bir cavab vermişdi. İndi təkliflərinizin hansı tələblərə cavab verəcəyinə dair qərar vermək lazımdır. Bilmək lazımdır ki, iki növ kolleksiyalar var. Onlardan biri dəyişdirilməyən bir kolleksiya, ikincisi isə daha sonra obyektin dəyişdirilməsinə imkan verəcək bir kolleksiya.

Beləliklə, burada iki istifadə halına qısa bir nümunə verəcəyəm.

  • Davamlı toplama yaradılması: Yaradılandan sonra toplama obyektini dəyişdirmək istəmirsinizsə

    List<Element> elementList = Arrays.asList(array)

  • Değiştirilebilir koleksiyonlar oluşturma: Oluşturulduktan sonra yaratılmış toplama nesnesini dəyişdirmək istədiyiniz zaman.

    List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));

2
25 июля '17 в 9:03 2017-07-25 09:03 Cavab Sumit Das tərəfindən 25 iyul '17 'də 9:03 2017-07-25 09:03' də verilir
  • 1
  • 2