본문 바로가기

JAVA

[JAVA] Array to List

알고리즘 문제를 풀 때 입력은 array로 주어지지만, 이 arryay에 접근해서 다양한 조작을 해야 할 때가 많다.
이때 배열을 List형 컬랙션으로 바꾸면
add로 삽입, remove로 삭제, set으로 수정, contains와 indexOf로 탐색다양한 조작이 가능하다.
배열을 리스트로 바꾸기 위한 키워드는 Arrays.asList(arr)Collections.addAll(list, arr); 이다.

1. Arrays.asList(arr) 

List<T> list = Arrays.asList(arr); 를 사용하여 배열을 List로 바꿀 수 있다.

※ 주의 : 여기서 asList( )메소드가 리턴하는 List는 불변(unmodifiable) 속성의 list view를 리턴한다.
unmodifiable이므로 이 List를 수정하면 예외가 발생한다.
view이므로 arr을 바꾸면 List에도 반영이 된다.
따라서 List를 활용 가능한 상태로 바꾸고 싶다면,
Arrays.asList(arr)를 ArrayList나 LinkedList의 생성자에 넣어주면 된다.
e.g. LinkedList<String> list = new LinkedList<>(Arrays.asList(arr));

2. Collections.addAll(list, arr) 

Collections.addAll(list, arr); 을 사용하는 방법도 있다.
첫번째 매개변수로는 텅 빈 List형 컬렉션이 와야 한다.
Collections.addAll은 그 자체로 완전한 코드이므로 리턴값 없이 첫번째 매개변수로 오는 list가 arr의 원소로 채워진다.

public class Test {
    public static void main(String[] args) {
        String[] arr = new String[] {"a", "b", "c"};
        // Arrays.asList 사용
        LinkedList<String> list1 = new LinkedList<>(Arrays.asList(arr));
        System.out.println(list1);
        // Collections.addAll 사용
        LinkedList<String> list2 = new LinkedList<>();
        Collections.addAll(list2, arr); // 첫번째 매개변수는 비어있는 list형 자료구조
        System.out.println(list2);
    }
}

3. int[ ] to LinkedList<Integer>

int 와 Integer의 경우 하나씩은 자동 형변환이 일어나지만, 배열 단위로 대응시킬 수는 없다.
따라서 LinkedList<Integer> ll = new LinkedList<>(Arrays.asList(arr))
Collections.addAll(ll, arr)도 에러가 발생한다.
하나씩은 자동 형변환이 이루어진다는 사실을 이용하면 이를 해결할 수 있다.
step 1 : int[ ] → Integer[ ]
step 2 : Integer[ ] → LinkedList<Integer>

// int array to Integer array
int[] arr2 = {1,2,3,4,5};
Integer[] arr2_ = new Integer[arr2.length];
for (int i = 0; i < arr2.length ; i++) {
    arr2_[i] = arr2[i];
}
// Integer array to Integer LinkedList
LinkedList<Integer> ll1 = new LinkedList<>(Arrays.asList(arr2_));
LinkedList<Integer> ll2 = new LinkedList<>();
Collections.addAll(ll2, arr2_);