Създаване на променлив списък от масив?

Имам масив, който бих искал да превърна в List, за да променя съдържанието на масива.

Stack Overflow има много въпроси/отговори, които се отнасят до Arrays.asList() и как предоставя само изглед на списък на основния масив и как опитът за манипулиране на получения списък обикновено ще изхвърли UnsupportedOperationException като методи, използвани за манипулиране на списъка (напр. add(), remove(), и т.н.) не се изпълняват от изпълнението на List, предоставено от Arrays.asList().

Но не мога да намеря пример как да превърна масив в променлив списък. Предполагам, че мога да превъртя масива и put() всяка стойност в нов списък, но се чудя дали има интерфейс, който да направи това вместо мен.


person ericsoco    schedule 25.07.2012    source източник


Отговори (5)


Един прост начин:

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

Това ще създаде променлив списък - но той ще бъде копие на оригиналния масив. Промяната на списъка няма да промени масива. Можете да го копирате по-късно, разбира се, като използвате toArray.

Ако искате да създадете променлив изглед върху масив, вярвам, че ще трябва да го внедрите сами.

person Jon Skeet    schedule 25.07.2012
comment
Това е напълно приемливо за моите нужди. Добре съм с изхвърлянето на оригиналния масив. - person ericsoco; 26.07.2012
comment
Arrays.asList връща изглед върху масив, като поддържа тези мутиращи методи, които не влияят на размера на списъка - person Timo Westkämper; 11.12.2012
comment
@TimoWestkämper: Да, но след това създавам нов ArrayList от този изглед. - person Jon Skeet; 11.12.2012
comment
@jon-skeet Знам, просто заявявах, че Arrays.asList ви дава списък, поддържан от масив с ограничена променливост, ако имате нужда от добавяне/премахване/вмъкване, тогава опаковането на ArrayList е по-добър подход. - person Timo Westkämper; 11.12.2012
comment
Java трябва да направи променливостта/неизменността ясна във всички тези статични фабрични методи. Лошо е да разбереш, че си направил неизменно нещо по време на изпълнение. - person dustinevan; 19.06.2018
comment
@dustinevan: Документацията е доста ясна IMO: Връща списък с фиксиран размер, подкрепен от посочения масив. (Промените в върнатия списък се записват в масива.) - person Jon Skeet; 19.06.2018
comment
@JonSkeet не искам да ви губя времето - благодаря за всичко, което правите. Просто бих искал да подложа гласуване за повече яснота в самите имена - сигурен съм, че документите са ясни. Някои от нас танцуват между езиците и това е достатъчно ясно на други езици. - person dustinevan; 19.06.2018

И ако използвате API за събиране на Google (Guava):

Lists.newArrayList(myArray);
person vsingh    schedule 11.10.2013
comment
Това е най-лаконичният отговор. Благодаря. - person eugene82; 24.06.2015
comment
Дори самият Guava препоръчва използването на new ArrayList<>(Arrays.asList(...)) - javadoc за метода предполага, че той ще стане остарял, защото не е достатъчно полезен. - person Logan Pickup; 03.01.2018
comment
2020 г. и все още не е оттеглен. Влезте! - person markthegrea; 12.11.2020
comment
Това трябва да е приетият отговор - person Kira Resari; 07.04.2021

Този прост код, използващ Stream API, включен в Java 8, създава променлив списък (или изглед), съдържащ елементите на вашия масив:

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

Или, също толкова валидно:

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

Ако използвате Eclipse Collections (по-рано GS Collections), можете да използвате FastList.newListWith(...) или FastList.wrapCopy(...).

И двата метода приемат varargs, така че можете да създадете масива в линия или да подадете в съществуващ масив.

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

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

Разликата между двата метода е дали масивът се копира или не. newListWith() не копира масива и по този начин отнема постоянно време. Трябва да избягвате да го използвате, ако знаете, че масивът може да бъде мутиран другаде.

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

Забележка: Аз съм комитер за Eclipse Collections.

person Craig P. Motlin    schedule 18.11.2013
comment
Това е хубав API за колекции, който имате. Първият, който видях, който може да ме изкуши да се отдалеча от собствените си реализации... единственото нещо, което изглежда липсва, което намирам като цяло полезно, е имплементация на сортиран набор, подкрепена от масив (което намирам за много по-ефективно от дървовидна реализация или за данни, които рядко се модифицират, или за набори, които могат да бъдат модифицирани често, но обикновено съдържат по-малко от 10 елемента). - person Jules; 13.03.2014

person    schedule
comment
@JonSkeet знам, че коментарът ви е от 2012 г. и сега живея в бъдещето, но предполагам, че този коментар не се е запазил добре, като се има предвид, че моята IDE специално подчертава и казва хей, не декларирайте това с деклариран Тип. не ти трябва ли там? - person Brent Thoenen; 24.07.2019
comment
@BrentThoenen: Не разбирам коментара ви. Забелязахте ли, че коментарът ми се отнася до ревизия 1, която използва myNewArrayList = new ArrayList(...), т.е. необработения тип? Има разлика между използването на оператора диамант, за да позволи на компилатора да изработи аргумент тип и използването на необработен тип. - person Jon Skeet; 24.07.2019
comment
Публикувах този отговор и живях в забрава през цялото това време, че самият @JonSkeet коментира моя отговор. Благодаря на Брент за коментара. - person Sid; 24.07.2019
comment
@JonSkeet ах, моя грешка. не проверих ревизията, която коментирахте. Направих погрешно предположение в това, че 2012 java също приема празен диамант оператор като необработен тип. Това е моята б. Благодаря за отговора! - person Brent Thoenen; 25.07.2019