etc./StackOverFlow

배열에서 ArrayList 생성

청렴결백한 만능 재주꾼 2021. 10. 5. 04:43
반응형

질문자 :Ron Tuffin


다음과 같이 초기화된 배열이 있습니다.

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

ArrayList 클래스의 객체로 변환하고 싶습니다.

 ArrayList<Element> arraylist = ???;


new ArrayList<>(Arrays.asList(array));

Tom

주어진:

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

가장 간단한 대답은 다음을 수행하는 것입니다.

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

이것은 잘 작동합니다. 그러나 몇 가지 주의 사항:

  1. asList 에서 반환된 목록의 크기는 고정되어 있습니다 . 따라서 코드의 반환된 목록에서 요소를 추가하거나 제거하려면 이를 새 ArrayList 로 래핑해야 합니다. 그렇지 않으면 UnsupportedOperationException 합니다.
  2. asList() 에서 반환된 목록은 원래 배열에 의해 뒷받침됩니다. 원래 배열을 수정하면 목록도 수정됩니다. 이것은 놀라운 것일 수 있습니다.

Alex Miller

(오래된 스레드이지만 아무도 Guava 또는 기타 라이브러리 및 기타 세부 사항에 대해 언급하지 않기 때문에 단 2센트)

가능하면 구아바를 사용하십시오

이러한 속임수를 크게 단순화하는 Guava 방식을 지적할 가치가 있습니다.

용법

불변 목록의 경우

ImmutableList 클래스와 해당 of()copyOf() 팩토리 메서드를 사용합니다 (요소는 null일 수 없음) .

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

변경 가능한 목록의 경우

Lists 클래스와 newArrayList() 팩토리 메소드를 사용하십시오:

 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

다른 클래스의 다른 데이터 구조에 대해서도 유사한 방법(예: Sets 유의하십시오.

왜 구아바인가?

주요 매력은 유형 안전을 위한 제네릭으로 인한 혼란을 줄이는 것입니다. Guava 팩토리 메소드를 사용하면 대부분의 경우 유형을 유추할 수 있기 때문입니다. 그러나 이 인수는 Java 7이 새로운 다이아몬드 연산자와 함께 도착한 이후로 더 적은 수의 물을 보유합니다.

그러나 이것이 유일한 이유는 아닙니다(그리고 Java 7이 아직 모든 곳에 있는 것은 아닙니다). 약식 구문도 매우 편리하고 위에서 본 것처럼 메서드 초기화 프로그램을 사용하면 보다 표현적인 코드를 작성할 수 있습니다. 하나의 Guava 호출로 현재 Java Collections로 2가 소요되는 작업을 수행합니다.


당신이 할 수 없다면 ...

불변 목록의 경우

Collections.unmodifiableList() 래핑된 JDK의 Arrays 클래스와 asList() 팩토리 메소드를 사용하십시오.

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

asList() 대한 반환 유형은 구체적인 ArrayList 구현을 List java.util.ArrayList 가 아닙니다 . ArrayList 를 에뮬레이트하지만 실제로는 전달된 배열을 직접 참조하고 "쓰기"로 만드는 내부 유형입니다(수정 사항은 배열에 반영됨).

AbstractList 를 확장하는 방식으로 List API의 일부 메서드를 통한 수정을 금지하지만(따라서 요소 추가 또는 제거는 지원되지 않음) set() 을 호출하여 요소를 재정의할 수 있습니다. 따라서 이 목록은 실제로 변경할 수 없으며 asList() Collections.unmodifiableList() 로 래핑되어야 합니다.

변경 가능한 목록이 필요한 경우 다음 단계를 참조하세요.

변경 가능한 목록의 경우

위와 같지만 실제 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+

교육용: Good ol' Manual Way

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

haylem

이 질문은 꽤 오래되었기 때문에 아무도 아직 가장 간단한 형식을 제안하지 않았다는 사실에 놀랐습니다.

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

Java 5부터 Arrays.asList() 는 varargs 매개변수를 사용하므로 명시적으로 배열을 구성할 필요가 없습니다.


Tim Büthe

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

myArray T 와 같은 유형인지 확인하십시오. 예를 들어 int 배열에서 List<Integer> 를 만들려고 하면 컴파일러 오류가 발생합니다.


Bill the Lizard

성능 면 new ArrayList(Arrays.asList(array)) 솔루션과 본질적으로 동일하지만 다른 방법은 다음과 같습니다.

 Collections.addAll(arraylist, array);

Peter Tseng

자바 9

Java 9 에서는 List.of 정적 팩토리 메서드를 사용하여 List 리터럴을 만들 수 있습니다. 다음과 같은 것:

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

이렇게 하면 세 개의 요소가 포함 된 변경할 수 없는 목록이 반환됩니다. 변경 가능한 목록을 원하면 해당 목록을 ArrayList 생성자에 전달하십시오.

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

JEP 269: 컬렉션을 위한 편리한 팩토리 메서드

JEP 269 는 Java Collections API에 대한 몇 가지 편리한 팩토리 메소드를 제공합니다. 이러한 불변의 정적 팩토리 메소드는 Java 9 이상에서 List , SetMap


Ali Dehghani

아마도 ArrayList가 아닌 List가 필요할 것입니다. 이 경우 다음을 수행할 수 있습니다.

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

Kip

2014년에 거의 끝나는 또 다른 업데이트는 Java 8에서도 수행할 수 있습니다.

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

List 수 있다면 몇 개의 문자가 저장될 것입니다.

 List<Element> list = Stream.of(myArray).collect(Collectors.toList());

yamilmedina

다음을 사용하는 경우:

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

두 개의 목록을 만들고 채울 수 있습니다! 큰 목록을 두 번 채우는 것은 용량을 확장해야 할 때마다 Object[] 배열을 생성하기 때문에 하고 싶지 않은 일입니다.

다행히 JDK 구현은 빠르고 Arrays.asList(a[]) 는 매우 잘 수행됩니다. Object[] 데이터가 직접 배열을 가리키는 Arrays.ArrayList라는 일종의 ArrayList를 만듭니다.

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

위험한 측면은 초기 배열을 변경하면 List 가 변경된다는 것입니다! 정말 원하세요? 예, 아닐 수도 있습니다.

그렇지 않은 경우 가장 이해하기 쉬운 방법은 다음과 같습니다.

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

또는 @glglgl이 말했듯이 다음을 사용하여 다른 독립적인 ArrayList를 만들 수 있습니다.

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

Collections , Arrays 또는 Guava를 사용하는 것을 좋아합니다. 하지만 어울리지 않거나 느껴지지 않으면 다른 우아한 줄을 대신 쓰세요.


Nicolas Zozol

Java 9 에서는 다음을 사용할 수 있습니다.

 List<String> list = List.of("Hello", "World", "from", "Java"); List<Integer> list = List.of(1, 2, 3, 4, 5);

MarekM

질문에 따르면 Java 1.7을 사용한 답변은 다음과 같습니다.

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

그러나 항상 인터페이스를 사용하는 것이 좋습니다.

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

nekperu15739

// Guava import com.google.common.collect.ListsLists ... List<String> list = Lists.newArrayList(aStringArray);

Bohdan

Java 8 이후로 변환하는 더 쉬운 방법이 있습니다.

 import java.util.List; import static java.util.stream.Collectors.toList; public static <T> List<T> fromArray(T[] array) { return Arrays.stream(array).collect(toList()); }

Andrii Abramov

다른 방법을 사용하여 변환할 수 있습니다.

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

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

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

자세한 내용은 http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html을 참조하십시오.


mary_jane

모두가 말했듯이 이것은 그렇게 할 것입니다

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

배열을 생성하는 가장 일반적인 최신 방법은 observableArrays입니다.

ObservableList: 변경 사항이 발생할 때 리스너가 변경 사항을 추적할 수 있도록 하는 목록입니다.

Java SE의 경우 시도해 볼 수 있습니다.

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

Oracle Docs 에 따르면

observableArrayList() arraylist가 지원하는 새로운 빈 관찰 가능 목록을 만듭니다. observableArrayList(E... items) 항목이 추가된 새로운 관찰 가능한 배열 목록을 만듭니다.

자바 9 업데이트

또한 Java 9에서는 약간 쉽습니다.

 List<String> list = List.of("element 1", "element 2", "element 3");

jemystack

Java 8에서 스트림을 사용하여 수행할 수도 있습니다.

 List<Element> elements = Arrays.stream(array).collect(Collectors.toList());

Vaseph

  1. Arrays.asList() 메서드의 정의를 보면 다음과 같은 결과를 얻을 수 있습니다.

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

    따라서 다음과 같이 arraylist 초기화할 수 있습니다.

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

    참고 : 각각의 new Element(int args) 는 개별 객체로 취급되며 var-args 로 전달될 수 있습니다.

  2. 이 질문에 대한 또 다른 대답도 있을 수 있습니다.
    java.util.Collections.addAll() 메소드에 대한 선언을 보면 다음과 같은 결과를 얻을 수 있습니다.

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

    따라서 이 코드는 그렇게 하는 데에도 유용합니다.

     Collections.addAll(arraylist, array);

Vikrant Kashyap

또 다른 간단한 방법은 for-each 루프를 사용하여 배열의 모든 요소를 새 ArrayList에 추가하는 것입니다.

 ArrayList<Element> list = new ArrayList<>(); for(Element e : array) list.add(e);

spencer.sm

배열이 기본 유형인 경우 지정된 답변이 작동하지 않습니다. 그러나 Java 8부터 다음을 사용할 수 있습니다.

 int[] array = new int[5]; Arrays.stream(array).boxed().collect(Collectors.toList());

A1m

이 질문에 완벽하게 작성된 답변이 많이 있지만 제 입력을 추가하겠습니다.

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

새로운 ArrayList는 다음과 같은 방법으로 생성할 수 있습니다.

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

그리고 ArrayList의 모든 작업을 매우 잘 지원합니다.

 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

그러나 다음 작업은 실제 ArrayList가 아닌 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));

따라서 일부 ArrayList 작업을 수행하려고 할 때 오류가 발생합니다.

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

배열 링크 의 목록 표현에 대해 자세히 알아보십시오.


Devendra Lattu

가장 간단한 방법은 다음 코드를 추가하는 것입니다. 시도하고 테스트했습니다.

 String[] Array1={"one","two","three"}; ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));

Hemin

또 다른 Java8 솔루션 (큰 세트 중에서 답을 놓쳤을 수 있습니다. 그렇다면 사과드립니다). 이것은 ArrayList(List와 반대)를 생성합니다. 즉, 요소를 삭제할 수 있습니다.

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

출력은...
안녕하십니까
세계


Toothless Seer

다음과 같이 Java 8에서 할 수 있습니다.

 ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());

Adit A. Pillai

ArrayList 로 쉽게 변환할 수 있습니다. 한 목록에서 다른 목록으로 내용을 복사할 목적으로 Collection 인터페이스의 addAll()

 Arraylist arr = new Arraylist(); arr.addAll(Arrays.asList(asset));

rashedcs

다음 코드를 사용하여 요소 배열을 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]); }

Kavinda Pushpitha

주어진 객체 배열:

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

배열을 목록으로 변환:

 List<Element> list = Arrays.stream(array).collect(Collectors.toList());

배열을 ArrayList로 변환

 ArrayList<Element> arrayList = Arrays.stream(array) .collect(Collectors.toCollection(ArrayList::new));

배열을 LinkedList로 변환

 LinkedList<Element> linkedList = Arrays.stream(array) .collect(Collectors.toCollection(LinkedList::new));

목록 인쇄:

 list.forEach(element -> { System.out.println(element.i); });

산출

1

2


Arpan Saini

이미 모든 사람들이 귀하의 문제에 대해 충분한 답변을 제공했습니다. 이제 모든 제안에서 요구 사항에 맞는 것을 결정해야 합니다. 알아야 할 컬렉션에는 두 가지 유형이 있습니다. 하나는 수정되지 않은 컬렉션이고 다른 하나는 나중에 개체를 수정할 수 있는 컬렉션입니다.

그래서 여기서는 두 가지 사용 사례에 대한 간단한 예를 보여 드리겠습니다.

  • 불변 컬렉션 생성 :: 컬렉션 객체 생성 후 수정을 원하지 않는 경우

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

  • 변경 가능한 컬렉션 생성 :: 생성된 컬렉션 객체를 생성 후 수정하고자 할 때.

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


Sumit Das

Java 8의 Arrays 클래스는 기본 배열과 객체 배열을 모두 허용하는 오버로드된 버전이 있는 stream() 메서드를 제공합니다.

 /**** Converting a Primitive 'int' Array to List ****/ int intArray[] = {1, 2, 3, 4, 5}; List<Integer> integerList1 = Arrays.stream(intArray).boxed().collect(Collectors.toList()); /**** 'IntStream.of' or 'Arrays.stream' Gives The Same Output ****/ List<Integer> integerList2 = IntStream.of(intArray).boxed().collect(Collectors.toList()); /**** Converting an 'Integer' Array to List ****/ Integer integerArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; List<Integer> integerList3 = Arrays.stream(integerArray).collect(Collectors.toList());

Himanshu Dave

아래 코드는 이를 수행하는 좋은 방법인 것 같습니다.

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

Singh123

출처 : 여기를 클릭하세요


출처 : http:www.stackoverflow.com/questions/157944/create-arraylist-from-array

반응형