Как преобразовать List в Array и наоборот в Java
Допустим, у нас есть список, и надо его преобразовать в массив. Как это сделать? Возьмем для примера список строк:
List list = new ArrayList<>(); list.add("Petya"); list.add("Vasya");
Мы хотим преобразовать его в массив:
String[] stringArray =
Сделаем это без сторонних библиотек средствами JDK. Начнем с 11 версии, дальше покажу способы на 8 версии, и потом метод с Generics.
Способ № 1 (JDK 11)
Итак, с 11 версии список в массив можно преобразовать вот так изящно:
String[] stringArray = list.toArray(String[]::new);
Способ № 2 (JDK 8)
В 8 версии можно сделать так (внимание, в скобках параметром указываем тип массива, а иначе результирующий массив будет типа Object[]):
String[] stringArray = list.toArray(new String[0]);
Заметьте, что в аргументе можно указать массив нулевой длины, главное, что есть тип. В этом случае будет создан и вернется новый массив нужной длины. Если же список помещается, то вернется тот, что в аргументе.
Способ № 3 с использованием stream() (JDK 8)
String[] stringArray = list.stream().toArray(String[]::new);
Метод для Generics
Допустим, надо написать общий метод для любого типа данных:
private static String[] listToArray(List list)
Проверим, что он работает. Создадим класс:
class Person < private String name; public Person(String name) < this.name = name; >public String toString() < return name; >>
@Test public void m4() < Listlist=new ArrayList<>(); list.add(new Person("Petya")); list.add(new Person("Vasya")); String[] stringArray = listToArray(list); assertThat(stringArray[0], is("Petya")); assertThat(stringArray[1], is("Vasya")); >
Преобразование Array в List
Теперь допустим у нас есть массив строк:
String[] stringArray = new String[];
Массив в List преобразуется так:
List list = Arrays.asList(stringArray);
Но полученный массив — фиксированного размера, в него нельзя добавлять и удалять элементы. Менять же элементы внутри можно, при этом изменения отразятся на массиве. И наоборот.
Чтобы получить обычный List, можно создать новый List на основе предыдущего:
new ArrayList(list);
Также метод не годится для преобразования массива примитивов в список, т.к. возьмет переданный массив в качестве первого объекта.
Преобразование массива примитивов в список List
Для примитивов проще использовать метод стримов boxed():
int[] ar=; List list= Arrays.stream(ar).boxed().toList();
Исходный код
Код примеров доступен на GitHub (в тестах).
Автор sysout Опубликовано 31.12.2019 14.11.2023 Рубрики Core Java
Добавить комментарий Отменить ответ
Прошу прощения: на комментарии временно не отвечаю.
Класс ArrayList . Методы преобразующие массив в целом
В примере формируется массив чисел. Затем с помощью метода clone() делается копия массива. В копии меняется один элемент. Под конец выводятся оба массива. После результата видно, что массивы имеют разные значения. Это означает, что они размещаются в разных участках памяти. Изменение значений в одном массиве не влияет на другой массив.
import java.util.*; public class TrainCollections < public static void main(String[] args) < // Метод clone() - сделать копию из коллекции // 1. Создать коллекцию из чисел ArrayList AL = new ArrayList(); AL.add(1); AL.add(2); AL.add(3); AL.add(4); AL.add(5); System.out.println("AL => " + AL); // 2. Сделать копию из коллекции ArrayList AL2 = (ArrayList) AL.clone(); // 3. Вывести копию AL2 System.out.println("AL2 => " + AL2); // 4. Изменить копию AL2 AL2.set(2, 100); // Изменить другой элемент // 5. Вывести оригинал AL и копию AL2 System.out.println("After change AL2: "); System.out.println("AL color: #0000ff;">out.println("AL2 color: #333300;">⇑2. Метод subList().Получить фрагмент массива на основе заданного массива
Метод subList() возвращает подмассив на основе заданного массива. Общая форма объявления метода следующая
public List subList(int fromIndex, int toIndex);
- fromIndex , toIndex – диапазон значений в исходном массиве, на основе которого формируется результирующий массив.
Для метода определены следующие особенности:
- значение fromIndex рассматривается как включенное. Значение toIndex рассматривается как исключенное. Например, если нужно получить первые 3 элемента массива, то fromIndex=0 , toIndex=3 ;
- если fromIndex и toIndex равны между собой, то возвращается пустой массив;
- возвращаемый список является составной частью исходного списка. Это означает, что все изменения в результатах будут изменять исходный список. И, напротив, все изменения в исходном списке будут влиять на результирующий список;
- для результирующего списка определены все основные операции над списком, которые будут влиять на исходный список.
При неправильном использовании метода могут быть сгенерированы следующие исключения:
- IndexOutOfBoundsException – случай, когда значение fromIndexsize() ;
- IllegalArgumentException – случай, когда fromIndex>toIndex .
Пример.
import java.util.*; public class TrainCollections < public static void main(String[] args) < // Метод subList() - получить подмассив на основе заданного массива // 1. Создать массив чисел ArrayList AL = new ArrayList(); AL.add(10); AL.add(20); AL.add(30); AL.add(40); AL.add(50); AL.add(60); AL.add(70); // 2. Вывести исходный массив AL System.out.print("AL => "); for (int i=0; iout.print(AL.get(i) + " "); System.out.println(); // 3. Получить подмассив List AL2 = (List) AL.subList(1, 4); // AL2 = // 4. Вывести подмассив System.out.print("AL2 => "); for (int i=0; iout.print(AL2.get(i) + " "); System.out.println(); // 5. Изменить элементы с индексами 2, 3 в исходном массиве, // будет изменяться и массив AL2 AL.set(2, 55); AL.set(3, 88); // AL2 => 20 555 888 // 6. Вывести подмассив System.out.print("AL2 => "); for (int i=0; iout.print(AL2.get(i) + " "); System.out.println(); // 7. Очистить массив AL2 AL2.clear(); // 8. Вывести исходный массив System.out.print("AL => "); for (int i=0; iout.print(AL.get(i) + " "); System.out.println(); > >
Результат выполнения программы
AL => 10 20 30 40 50 60 70 AL2 => 20 30 40 AL2 => 20 55 88 AL => 10 50 60 70
3. Метод toArray() . Конвертировать массив ArrayList в массив типа Object[]
Метод toArray() конвертирует массив ArrayList в массив типа Object[] . Согласно документации объявления метода следующее
public Object[] toArray();
Пример.
В этом примере создается массив символов типа ArrayList . Затем этот массив преобразуется в массив типа Object[] .
import java.util.*; public class TrainCollections < public static void main(String[] args) < // Метод toArray() - получить подмассив на основе заданного массива // 1. Создать массив символов ArrayList AL = new ArrayList(); AL.add('0'); AL.add('1'); AL.add('2'); AL.add('3'); AL.add('4'); AL.add('5'); // 2. Вывести исходный массив AL System.out.print("AL => "); for (int i=0; iout.print(AL.get(i) + " "); System.out.println(); // 3. Конвертировать в массив типа Object[] Object AC[] = AL.toArray(); // 4. Вывести массив AC System.out.print("AC => "); for (int i=0; iout.print(AC[i] + " "); System.out.println(); > >
Результат выполнения программы
AL => 0 1 2 3 4 5 AC => 0 1 2 3 4 5
4. Метод retainAll() . Сформировать новый массив, содержащий элементы заданной коллекции
Метод retainAll() позволяет в заданном массиве сохранить только элементы, которые определены в заданной коллекции. Иными словами, метод удаляет из массива элементы, не содержащиеся в заданной коллекции. Согласно документации объявление метода имеет следующий вид
public boolean retainAll(Collection c);
- c – коллекция элементов, которые необходимо сохранить в исходном массиве.
Если в исходном массиве произошли изменения, метод возвращает true .
Пример.
В примере выполняются следующие действия:
- создается исходный массив целых чисел AL ;
- создается массив AL2 , содержащий числа, которые нужно оставить в массиве AL ;
- вызывается метод retainAll() для массива AL .
import java.util.*; import java.util.function.*; public class TrainCollections < public static void main(String[] args) < // Метод retainAll() - сформировать новый массив на основе заданного // 1. Создать коллекцию целых чисел ArrayList AL = new ArrayList(); AL.add(2); AL.add(3); AL.add(2); AL.add(4); AL.add(7); AL.add(3); AL.add(5); AL.add(8); AL.add(4); // 2. Вывести исходную коллекцию целых чисел с помощью итератора Iterator it = AL.iterator(); System.out.print("AL => "); while (it.hasNext()) System.out.print(it.next()+" "); System.out.println(); // 3. Сформировать коллекцию элементов, которые нужно оставить в массиве AL ArrayList AL2 = new ArrayList(); AL2.add(2); AL2.add(4); AL2.add(6); AL2.add(8); // 4. Вывести коллекцию AL2 System.out.print("AL2 => "); for (int i=0; iout.print(AL2.get(i) + " "); System.out.println(); // 5. Вызвать метод retainAll() AL.retainAll(AL2); // 6. Вывести измененную коллекцию AL it = AL.iterator(); System.out.print("AL => "); while (it.hasNext()) < System.out.print(it.next() + " "); > > >
Результат выполнения программы
AL => 2 3 2 4 7 3 5 8 4 AL2 => 2 4 6 8 AL => 2 2 4 8 4
Связанные темы
- Класс ArrayList . Динамический массив. Общие сведения. Создание массива
- Методы изменяющие данные в массиве. Методы add() , addAll() , clear() , remove() , removeIf() , replaceAll() , set() , sort()
- Методы, определяющие информацию об элементах массива. Методы get() , contains() , containsAll() , indexOf() , lastIndexOf() , iterator() , listIterator()
- Методы определяющие общие характеристики массива. Методы ensureCapacity() , isEmpty() , size() , trimToSize()
Как преобразовать массив в arraylist java
О Хекслете
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
23 ноября 2021
21 декабря 2021
23 ноября 2021
- 8 800 100 22 47 бесплатно по РФ
- +7 495 085 28 38 бесплатно по Москве
Направления
- Курсы «Backend-разработка»
- Курсы «Frontend-разработка»
- Курсы «Создание сайтов»
- Курсы «Тестирование»
- Курсы «Аналитика данных»
- Интенсивные курсы
- Курсы DevOps
- Курсы «Веб-разработка»
- Курсы «Математика для программистов»
- Все курсы
О Хекслете
- О нас
- Карьера в Хекслете
- Хекслет Колледж
- Сведения об образовательной организации
- Лицензия № Л035-01216-73/00668844
ООО «Хекслет Рус» 432071, г. Ульяновск, пр-т Нариманова, дом 1Г, оф. 23 ОГРН 1217300010476
- Справка
- Вопросы и ответы
- Сообщество
- Дополнительно
- Условия использования
- Соглашение об обработке ПД
- Оферта
- Акции
Преобразовать из массива в ArrayList
Преобразовать ArrayList в Array и обратно
Всем доброго времени суток! Есть коллекция строк ArrayList<String> mass. Мне нужно преобразовать.
Не получается преобразовать ArrayList в double[]
Не получается преобразовать ArrayList в массив типа double Console.WriteLine("Чтение файла");.
Преобразовать считываемые числа в ArrayList
Помогите пожалуйста дописать код. Нужно прочитать инты с файла, преобразовать это в ArrayList.
Преобразовать ArrayList в массив типа Object[][]
Привет ! Подскажите пожалуйста, как правильно преобразовать в двумерный массив типа Object список .
Преобразовать строку, разделенную пробелами, в ArrayList и вывести его в консоли
Преобразовать строку, разделенную пробелами, в ArrayList и вывести его в консоли Выводит.
3540 / 2144 / 566
Регистрация: 02.09.2015
Сообщений: 5,435
spacekurama,
Arrays.stream(nums).boxed().collect(Collectors.toList())
Регистрация: 13.07.2018
Сообщений: 37
Сообщение от spacekurama
Всем привет!
Объясните пожалуйста как динамический массив преобразовать в ArrayList?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
import java.lang.reflect.Field; import java.util.*; public class MyTaskE> { private int start; private int end; private final int size; private ArrayListE> answer; private int[] nums; public MyTask(int size) { this.size = size; this.nums = new int[size]; } public int getSize() { return size; } public ListE> findPrime(int[] nums, int start, int end) { int m = 0; int a = 0; var res = new int[nums.length]; for (int i = 0; i nums.length; i++) { res[i] = nums[i]; } for (int k = start; k end + 1; k++) { for (int j = 2; j nums[k]; j++) { if (nums[k] % j == 0) { res[a] = m; } } a++; } this.answer = new ArrayListE>((Collection extends E>) Arrays.asList(res)); for(int i = 0; i nums.length - 1; i++) { System.out.println(answer.get(i) + " Prime"); } return answer; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(this.nums); return sb.toString(); } }
Возникает вопрос, это массив произвольного типа? массив примитивов(int, short, double) или массив любых объектов(Integer, Double)?
Регистрация: 05.07.2019
Сообщений: 43
Сам массив nums int
Ну, а в ArrayList только Integer ссылочный.
Вот сам не знаю как с этим разобраться
Добавлено через 9 минут
Что эта строка делает? Я добавил ее в код. Теперь answer = null
Регистрация: 13.07.2018
Сообщений: 37
Сообщение от spacekurama
Сам массив nums int
Ну, а в ArrayList только Integer ссылочный.
Вот сам не знаю как с этим разобраться
Добавлено через 9 минут
Что эта строка делает? Я добавил ее в код. Теперь answer = null
Все просто, в Java есть такое понятие как автоупаковка и распаковка это когда примитивные типы упаковываются в Integer и обратно для вычислений. В данном случае она не работает и вам это надо делать в ручную. ArrayList работает только с объектами, ваш вариант это Integer, но у вас массив int т.е. примитивный тип эту коллизию надо устранять. Есть 2 подхода и оба связаны так или иначе с итерациями т.е. проход каждого элемента и преобразования его в Integer. Таким образом у вас 2 варианта:
1 2 3 4 5 6
int [] m1 = new int [] {1,2,3,5}; ListInteger> list = new ArrayList<>(); for (int x : m1) { list.add(Integer.valueOf(x)); } System.out.println(list);
Итерируемся по массиву и для каждого элемента создаем объект Integer добавляя его в заранее подготовленный ArrayList
Второй вариант как указал автор выше:
Arrays.stream(m1).boxed().collect(Collectors.toList());
Тут мы создаем stream по элементам массива, затем явно вызываем для каждого элемента boxed() (Упаковка) - обертка Integer.valueOf(x), после этого говорим коллектить (собрать) все элементы в хранилище (Список) используя Collector.toList(). Это по сути тот же цикл но на больших массивах значительнее медленнее (зато красивее).
Регистрация: 05.07.2019
Сообщений: 43
Спасибо большое. Если у меня массив динамический, который заполняется рандомом, то это работает в этом случае?
Как я хотел сделать:
Работать с массивом и после массив скопировать в ArrayList и вернуть его.
2495 / 1944 / 486
Регистрация: 17.02.2014
Сообщений: 9,239
Сообщение от spacekurama
это ты пытаешься сделать свою реализацию дин массива?
3540 / 2144 / 566
Регистрация: 02.09.2015
Сообщений: 5,435
Вариант Apache Commons:
1 2 3
final Integer[] a = new Integer[nums.length]; Arrays.setAll(a, i -> nums[i]); final ListInteger> result = Arrays.asList(a);
Регистрация: 05.07.2019
Сообщений: 43
Нет. Реализации нет. в конструкторе я задаю размер массива
Перед началом работы очередь наполняется заданиями. После этого потоки забирают задачи и складывают результаты в ту же очередь. Работа каждого потока должна быть устроена следующим образом: забрать из очереди одно задани
Добавлено через 1 час 8 минут
Спасибо. Все получилось. Новая проблема. Не могу понять как удалить 0 из списка. Подскажите пожалуйста!
Вот мой способ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
public ListInteger> findPrime(ArrayListInteger> num, int start, int end) { int m = 0; int a = 0; Integer[] nums = new Integer[10]; Random r = new Random(); for (int i = 0; i nums.length; i++) { nums[i] = r.nextInt(24); } ArrayListInteger> val = new ArrayList<>(Arrays.asList(nums)); ListInteger> answer = new ArrayList<>(); answer.addAll(0, Arrays.asList(nums)); System.out.println(val); for (int k = start; k end + 1; k++) { for (int j = 2; j val.get(k); j++) { if (val.get(k) % j == 0) { answer.set(a, m); answer.add(m); } } a++; } for(int i = 0; i answer.size(); i++) { if (answer.get(i) == 0) { answer.remove(Integer.valueOf(0)); } } System.out.println(answer + " Prime"); return answer; }
Вот вывод: [12, 2, 23, 5, 19, 13, 12, 3, 20, 4]
[2, 23, 5, 19, 13, 3, 0, 0, 0, 0, 0, 0, 0] Prime
И с каждым разом компиляции размер списка prime(answer) меняется