Sukurkite „ArrayList“ iš masyvo

Turiu masyvą, kuris inicijuojamas taip:

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

Norėčiau konvertuoti šį masyvą į klasės ArrayList objektą.

 ArrayList<Element> arraylist = ???; 
3165
01 окт. Ron Tuffin nustatė spalio 01 d 2008-10-01 17:38 '08, 17:38, 2008-10-01 17:38
@ 35 atsakymai
  • 1
  • 2
 new ArrayList<>(Arrays.asList(array)) 
4174
01 окт. Atsakyti Tom spalio 01 d 2008-10-01 17:39 '08 at 17:39 pm 2008-10-01 17:39

Atsižvelgiant į:

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

Lengviausias atsakymas yra:

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

Tai veiks gerai. Tačiau keletas išlygų:

  • AsList grįžtamojo sąrašo dydis yra fiksuotas . Taigi, jei norite, kad galėtumėte pridėti ar pašalinti elementus iš grįžtamo kodo sąrašo, turite jį įdėti į naują „ ArrayList . Priešingu atveju gausite „ UnsupportedOperationException .
  • asList() grąžintas sąrašas yra palaikomas šaltinio masyvu. Jei pakeisite šaltinio masyvą, sąrašas taip pat bus pakeistas. Tai gali būti nuostabi.
811
01 окт. Atsakymas, kurį pateikė Alex Miller Oct 01 2008-10-01 18:39 '08, 18:39, 2008-10-01 18:39

(seni siūlai, bet tik 2 centai, nes niekas nemini Guavos ar kitų bibliotekų ir kitų detalių)

Jei galite, naudokite Guava.

Verta paminėti Gvajavos kelią, kuris labai supaprastina šiuos sukčiavimus:

Naudojimas

Dėl nepakeičiamo sąrašo

Naudokite „ ImmutableList klasę ir of() bei „ copyOf() gamyklinius metodus (elementai negali būti tušti) :

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

Dėl susieto sąrašo

Naudokite „ Lists klasę ir newArrayList() gamyklą:

 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 

Taip pat atkreipkite dėmesį į panašius metodus, taikomus kitoms duomenų struktūroms kitose klasėse, pavyzdžiui, Sets .

Kodėl Guava?

Pagrindinis dėmesys gali būti dėl nepatogumų, atsirandančių dėl generinių vaistų tipo saugumo, nes Gvavos gamyklinių metodų naudojimas leidžia tipus, kurie turėtų būti gaunami daugiausia laiko. Tačiau šiame argumente yra mažiau vandens, nes „Java 7“ atvyko su nauju deimantų operatoriumi.

Tačiau tai ne vienintelė priežastis (ir „Java 7“ nėra visur): taip pat labai patogi sutrumpinta sintaksė, o metodas inicijuoja, kaip matote aukščiau, leisti rašyti daugiau išraiškingų kodų. Jūs darote vieną Guavos skambutį, kuris užima 2 iš dabartinių „Java“ kolekcijų.


Jei negalite ...

Dėl nepakeičiamo sąrašo

Naudokite JDK klasės Arrays ir jos asList() gamyklą, supakuotą Collections.unmodifiableList()

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

Atkreipkite dėmesį, kad asList() grąžinimo tipas yra List , naudojant konkretų „ ArrayList įgyvendinimą, bet NOT java.util.ArrayList . Tai vidinis tipas, kuris emuliuoja „ ArrayList , bet iš tikrųjų reiškia perduotą masyvą ir sukelia jį „rašyti“ (pokyčiai atsispindi masyve).

Jis draudžia modifikacijas su kai kuriais API List metodais, naudojant paprastą AbstractList plėtinį (todėl elementų pridėjimas ar pašalinimas nepalaikomas), tačiau leidžia set() skambučius iš naujo apibrėžti elementus. Taigi šis sąrašas nėra iš tikrųjų nekintamas, o skambutis į asList() turi būti suvyniotas į Collections.unmodifiableList() .

Žiūrėkite kitą žingsnį, jei jums reikia modifikuoto sąrašo.

Sąlygų sąrašas

Kaip ir anksčiau, bet suvynioti į faktinį java.util.ArrayList :

 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+ 

Mokymo tikslais: tinkamas būdas vadovauti

 // 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 нояб. Atsakymą pateikia haylemas lapkričio 16 d 2012-11-16 20:16 '12 8:16 pm 2012-11-16 20:16

Kadangi šis klausimas yra gana senas, mane nustebina, kad niekas nepasiūlė paprasčiausios formos:

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

Pradedant „Java 5“, „ Arrays.asList() priima parametrą „varargs“, todėl nereikia aiškiai kurti masyvo.

208
22 июня '11 в 14:30 2011-06-22 14:30 atsakymą pateikė Tim Büthe birželio 22 d., 11 val. 14.30 val. 2011-06-22 14:30
 new ArrayList<T>(Arrays.asList(myArray)); 

Įsitikinkite, kad myArray yra toks pat kaip T Jei bandysite sukurti int masyvą, pvz., „ int masyvą, gausite kompiliatoriaus klaidą.

180
01 окт. Atsakymas, kurį pateikė Bill the Lizard Oct 01 2008-10-01 17:40 '08 at 17:40 pm 2008-10-01 17:40

Kitas būdas (nors iš esmės atitinka new ArrayList(Arrays.asList(array)) :

 Collections.addAll(arraylist, array); 
82
04 апр. Atsakymą pateikė Peter Tseng 04 Bal. 2012-04-04 02:20 '12 at 2:20 2012-04-04 02:20

„Java 9“

Java 9“ galite naudoti „ List.of statinį gamyklą, kad sukurtumėte List List.of . Kažkas panašaus į šiuos dalykus:

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

Tai grąžins nepakeistą sąrašą, kuriame yra trys elementai. Jei jums reikia modifikuoto sąrašo, perduokite šį sąrašą „ ArrayList konstruktoriui:

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

269 ​​JEP: trąšų gamyklos metodai kolekcijoms

„JEP 269“ pateikia keletą patogių „ Java“ kolekcijų API metodų. Šie statiniai statiniai gamykliniai metodai yra integruoti į „Java 9“ ir vėlesnės Map sąsajas List , Set ir Map .

71
17 апр. Ali Dehghani atsakymas balandžio 17 d 2016-04-17 19:58 '16 at 7:58 pm 2016-04-17 19:58

Tikriausiai jums reikia tik sąrašo, o ne „ArrayList“. Tokiu atveju galite tiesiog:

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

Kitas atnaujinimas, kuris beveik baigėsi 2014 m., Taip pat galite tai padaryti naudodami „Java 8“:

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

Bus išsaugoti keli simboliai, jei jis gali būti tik List

 List<Element> list = Stream.of(myArray).collect(Collectors.toList()); 
56
25 нояб. atsakymas duotas kodėl: lapkričio 25 d. 2014-11-25 23:48 '14, 11:48, 2014-11-25 23:48

Norėdami konvertuoti masyvą į „ArrayList“, kūrėjai dažnai tai daro:

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

Arrays.asList() grąžina „ArrayList“, kuris yra private static class inside Arrays nėra java.util.ArrayList klasė. The java.util.Arrays.ArrayList klasė set(), get(), contains() metodų, bet nėra elementų pridėjimo metodų, todėl jo dydis yra fiksuotas. Jei norite sukurti tikrą „ArrayList“, turite atlikti:

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

ArrayList konstruktorius gali priimti kolekcijos tipą , kuris taip pat yra super tipo java.util.Arrays.ArrayList

49
25 июня '14 в 10:20 2014-06-25 10:20 atsakymą pateikė Xar E Ahmer , birželio 25 d. 14, 10:20 2014-06-25 10:20

Jei naudojate:

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

Galite sukurti ir užpildyti du sąrašus! Didelio sąrašo užpildymas du kartus yra būtent tai, ko nenorite daryti, nes kiekvieną kartą, kai reikia padidinti pralaidumą, bus sukurta kita „ Object[] masyvo masyvas.

Laimei, JDK įgyvendinimas yra greitas, o Arrays.asList(a[]) yra labai gerai atliktas. Jis sukuria „ArrayList“, pavadintą „Arrays.ArrayList“, kur objekto [] duomenys nukreipiami tiesiai į masyvą.

 // 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 } .... } 

Pavojinga pusė yra ta, kad jei pakeisite pradinę masyvą, pakeisite sąrašą! . Ar tikrai norite? Galbūt taip, gal ne.

Jei ne, suprantamiausias būdas yra toks:

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

Arba, kaip nurodyta @glglgl, galite sukurti kitą nepriklausomą „ArrayList“ su:

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

Man patinka naudoti Collections , Arrays ar gvajavas. Bet jei jis netelpa arba nesijaučiate, tiesiog parašykite kitą negaliojančią eilutę.

31
18 янв. atsakymą pateikė Nicolas Zozol 18 jan. 2014-01-18 16:01 '14, 16:01 2014-01-18 16:01

Java 9 galite naudoti:

 List<String> list = List.of("Hello", "World", "from", "Java"); List<Integer> list = List.of(1, 2, 3, 4, 5); 
28
11 апр. Atsakymas pateikiamas MarekM 11 balandžio. 2017-04-11 15:20 '17 at 15:20 2017-04-11 15:20

Pagal atsakymą į klausimą naudojant java 1.7:

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

Tačiau visada geriau naudoti sąsają:

 List<Element> arraylist = Arrays.<Element>asList(array); 
25
18 мая '15 в 1:07 2015-05-18 01:07 atsakymą pateikė nekperu15739 gegužės 18, 15 d. 1:07 2015-05-18 01:07
 // Guava import com.google.common.collect.ListsLists ... List<String> list = Lists.newArrayList(aStringArray); 
21
07 янв. Bohdan atsakė į sausio 7 d 2014-01-07 09:04 '14 at 9:04 2014-01-07 09:04

Galite konvertuoti naudojant įvairius metodus.

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

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

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

Daugiau informacijos rasite http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html

17
02 мая '16 в 11:40 2016-05-02 11:40 atsakymas duotas oxy_js 02 gegužės 16 d. 11:40 2016-05-02 11:40

Kadangi „Java 8“ yra paprastesnis būdas konvertuoti:

 public static <T> List<T> fromArray(T[] array) { return Arrays.stream(array).collect(toList()); } 
14
23 дек. Atsakymą davė Andri Abramovas gruodžio 23 d. 2016-12-23 15:31 '16 at 15:31 pm 2016-12-23 15:31

Taip pat galite tai padaryti naudodami „Java 8“ srautą.

  List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 
13
06 февр. atsakymas pateikiamas Vaseph 06 vas . 2016-02-06 11:56 '16 at 11:56 2016-02-06 11:56

kaip visi sakė, kad tai padarys

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

ir labiausiai paplitęs naujas būdas sukurti masyvo matomų masyvų

ObservableList: sąrašas, leidžiantis klausytojams stebėti pokyčius, kai jie įvyksta.

„Java SE“ galite pabandyti

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

tai priklauso nuo „ Oracle“ dokumentų

observableArrayList () Sukuria naują tuščią stebėjimo sąrašą, kurį palaiko masyvas. observableArrayList (E ... items) Sukuria naują stebimų matricų sąrašą su pridėtais elementais.

„Java 9“ naujinimas

taip pat java 9 tai šiek tiek lengva:

 List<String> list = List.of("element 1", "element 2", "element 3"); 
12
05 янв. atsakymas duotas Abojemyeg 05 jan. 2017-01-05 21:32 '17 21:32 2017-01-05 21:32
  • Jei matysime „ Arrays.asList() metodo apibrėžimą, gausite kažką panašaus:

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

    Taigi, galite inicijuoti arraylist taip:

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

    Pastaba : kiekvienas new Element(int args) bus traktuojamas kaip atskiras objektas ir gali būti perkeltas kaip var-args .

  • Gali būti dar vienas atsakymas į šį klausimą.
    Jei matote java.util.Collections.addAll() metodo deklaraciją, gausite kažką panašaus:

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

    Taigi šis kodas taip pat naudingas.

     Collections.addAll(arraylist, array); 
10
30 марта '16 в 9:48 2016-03-30 09:48 atsakymą pateikė Vikrant Kashyap , kovo 30 d. 16, 09:48 2016-03-30 09:48

Kitas paprastas būdas yra įtraukti visus elementus iš masyvo į naują „ArrayList“, naudodami „for-every loop“.

 ArrayList<Element> list = new ArrayList<>(); for(Element e : array) list.add(e); 
8
16 дек. Atsakymą pateikė spencer.sm 16 Dec. 2015-12-16 23:32 '15, 23:32 2015-12-16 23:32

Jei masyvas yra primityvus, šie atsakymai neveiks. Bet su „Java 8“ galite naudoti:

 int[] array = new int[5]; Arrays.stream(array).boxed().collect(Collectors.toList()); 
6
10 июля '17 в 5:21 2017-07-10 05:21 atsakymas pateikiamas A1m liepos 10 d. 17:21 5:21 2017-07-10 05:21

Atsižvelgiant į:

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

Naudoti:

 List<Element> listArray = Arrays.asList(array); 
5
22 апр. Atsakymą pateikė Lakshan balandžio 22 d 2017-04-22 06:53 '17 ne 6:53 2017-04-22 06:53

Nepaisant to, kad į šį klausimą yra daug gražiai parašytų atsakymų, pridėsiu savo medžiagas.

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

Naujas „ArrayList“ gali būti sukurtas šiais būdais.

 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); 

Jie labai gerai palaiko visas „ArrayList“ operacijas.

 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 

Tačiau toliau nurodytos operacijos grąžina tik „ArrayList“ sąrašo vaizdą, o ne faktinį „ArrayList“.

 // 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)); 

Todėl jie bandys atlikti tam tikras operacijas su „ArrayList“

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

Skaitykite daugiau apie masyvo sąrašo rodinį.

4
07 апр. Devendra Lattu atsakymas 07 Bal 2017-04-07 21:45 '17 ne 21:45 2017-04-07 21:45

Tai galite padaryti java 8 taip

 ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList()); 
3
07 июня '17 в 15:14 2017-06-07 15:14 Atsakymą pateikė Adit A. Pillai birželio 17 d. 17 val. 15:14 2017-06-07 15:14

Tai galite padaryti lengvai su „Arrays.asList“ (arrayObj) masyvu;

 Element[] array = {new Element(1), new Element(2), new Element(3)}; ArrayList<Element> arraylist =Arrays.asList(array); 
3
26 окт. atsakymas duotas Ibz.Shaikh 26 okt. 2018-10-26 17:38 '18, 5:38 pm 2018-10-26 17:38

Naudokite šį kodą elementų masyvui konvertuoti į „ArrayList“.

 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 atsakymas 03 Dec 2018-12-03 14:32 '18, 14:32 pm 2018-12-03 14:32

Mes galime lengvai konvertuoti masyvą į ArrayList . Naudodami addAll() sąsajos metodą, addAll() kopijuoti turinį iš vieno sąrašo į kitą.

  Arraylist arr = new Arraylist(); arr.addAll(Arrays.asList(asset)); 
3
04 июля '17 в 10:22 2017-07-04 10:22 atsakymas pateikiamas rashedcs liepos 4 d. 17 d. 10:22 2017-07-04 10:22

Paprasčiausias būdas tai padaryti yra pridėti šį kodą. Išbandyta ir išbandyta.

 String[] Array1={"one","two","three"}; ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1)); 
3
03 мая '17 в 11:38 2017-05-03 11:38 atsakymas duotas Hemin 03 Gegužės 17 d. 11:38 2017-05-05 11:38

Kitas „Java8“ sprendimas (galiu praleisti atsakymą tarp didelės kolekcijos. Jei taip, atsiprašau). Tai sukuria „ArrayList“ (priešingai nei sąrašas), ty galite ištrinti elementus

 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); } } 

Išeiti ... Sveikas pasaulis

3
20 июня '17 в 11:33 2017-06-20 11:33 atsakymą pateikė „ Toothless Seer“ birželio 20 d. 17 val. 11:33 2017-06-20 11:33

Kiekvienas jau atsakė už jūsų problemą. Dabar visi pasiūlymai, kuriuos turite nuspręsti, kurie iš jų atitiks jūsų reikalavimus. Yra dviejų rūšių kolekcijos, kurias reikia žinoti. Vienas iš jų yra nepakeista kolekcija, kita - kolekcija, kuri leis vėliau pakeisti objektą.

Taigi čia pateiksiu trumpą dviejų naudojimo atvejų pavyzdį.

  • Nuolatinis kolekcijos kūrimas :: Jei nenorite keisti kolekcijos objekto po kūrimo

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

  • Sukuriamų kolekcijų kūrimas :: Kai norite sukurti sukurtą kolekcijos objektą po jo sukūrimo.

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

2
25 июля '17 в 9:03 2017-07-25 09:03 atsakymą pateikė „ Sumit Das “ liepos 17 d. 17 val. 9:03 2017-07-25 09:03
  • 1
  • 2

Kiti klausimai apie „ žymes arba „ Klauskite“