Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

DeFacto-Standard IT

[Java] Array to Collection, Collection to Array 변환 본문

Java/References

[Java] Array to Collection, Collection to Array 변환

defacto standard 2017. 9. 20. 09:52

자바8부터 방식이 바뀌었다.

--------------------------------------------

자바8에서는 다음과 같이 변경한다.


 - Array(int[], Integer[]) to Collection(List<Integer>)

1. int[] to List<Integer>

System.out.print("\n int[] to List<Integer> \n");

int[] intArr = new int[3];
intArr[1] = 1;
intArr[2] = 2;

for (int i : intArr)
System.out.print(i);

System.out.println();

List<Integer> integerListForInt = Arrays.stream(intArr).boxed().collect(Collectors.toList());

for (int i : integerListForInt)
System.out.print(i);



2. Integer[] to List<Integer>

System.out.print("\n Integer[] to List<Integer> \n");

Integer[] integerArr = new Integer[3];
integerArr[0] = 0; // Integer[0]은 자동으로 초기화되지 않는다.
integerArr[1] = 1;
integerArr[2] = 2;

for (int i : integerArr)
System.out.print(i);

System.out.println();

// Integer[] to List<Integer> 변환 후 출력
// Arrays.asList(integerArr); 도 사용 가능
List<Integer> integerListForInteger = Arrays.stream(integerArr).collect(Collectors.toList());
for (int i : integerListForInteger)
System.out.print(i);

System.out.println();

// Integer[] 바로 출력
for (int i : integerArr)
System.out.print(i);



자바8 이상에서 다음 코드는 컴파일 에러가 발생한다.


List<Integer> integerList =Arrays.asList( arr );  // 에러 발생


Incompatible types. Required List<Integer> but 'asList' was inferred to List<T>:

no instance(s) of type variable(s) exist to that int[] conforms to Integer inference variable T has incompatible bounds:

equality constraints:

Integer lower bounds:

int[]


이제 int[] 타입 배열을 넣어줄 수 없다. asList()의 소스를 까보면 선언부는 다음과 같다.

public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}


인자타입이 T로 바뀌었으며, 이에 따라 primitive type인 int, float 등은 들어갈 수 없다.

따라서 반드시 asList()를 사용하려는 경우 Integer[]나 Float[] 과 같은 Wrapper타입을 넣어야 한다.



 - Collection(List<Integer>) to Array(int[], Integer[])

1. List<Integer> to int[]

System.out.print("\n List<Integer> to int[] \n");

List<Integer> integerListForIntArr = new ArrayList<>();
integerListForIntArr.add(0);
integerListForIntArr.add(1);
integerListForIntArr.add(2);

for (int i : integerListForIntArr)
System.out.print(i);

System.out.println();

int[] intArr = integerListForIntArr.stream().mapToInt(Integer::intValue).toArray();

for (int i : intArr)
System.out.print(i);



2. List<Integer> to Integer[]

System.out.print("\n List<Integer> to Integer[] \n");

List<Integer> integerListForIntegerArr = new ArrayList<>();
integerListForIntegerArr.add(0);
integerListForIntegerArr.add(1);
integerListForIntegerArr.add(2);

for (int i : integerListForIntegerArr)
System.out.print(i);

System.out.println();

Integer[] integerArr = integerListForIntegerArr.toArray(Integer[]::new);

for (int i : integerArr)
System.out.print(i);



아래는 자바8 이하 버전이다.

----------------------------------------- 


자바에서는 Array와 Collection의 개념이 있다.


String strings[] = ...

List<String> strings= ...


위 2가지는 다르다.


위의 경우에는 Arrays 클래스를 사용하여 핸들링 해야하며

아래의 경우에는 Collections 클래스를 사용하여 핸들링해야한다.


Collections 클래스에는 Arrays 클래스에서 지원하는 것 보다 더 많은 기능이 있다.

그래서 자바에서는 Array를 ListCollection으로 변환하는 함수가 존재한다.


int arr[] = {1, 2, 3, 4, 5};

Collections.shuffle( Arrays.asList( arr ) );


위 코드는 1,2,3,4,5가 들어있는 int Array변수 arr을 리스트로 변환한 후(asList),

Collections 클래스를사용하여 (리스트로 변환된) 랜덤으로 섞는 코드이다.


Arrays에서는 shuffle()이 제공되지 않으므로 이러한 식으로 사용을 해야한다.


또한 Arrays.sort()는 오름차순 정렬인데, 내림차순 정렬은 제공되지 않는다.

역시 Collections에서는 오름차순(sort()), 내림차순(reverse())이 둘 다 제공된다.


Collections.reverse( Arrays.asList( arr ) );


이와 같이 Arrays는 배열을 List Collection으로 변환시키는 메서드를 제공함으로서 개발자가 좀더 편하고 쉽게 여러 기능을 사용할 수 있도록 지원한다.

Comments