거북이-https://velog.io/@violet_evgadn 이전완료

Stream을 활용한 Collection to Array & Array to Collection 본문

코딩 테스트 시 알면 좋은 것들

Stream을 활용한 Collection to Array & Array to Collection

VioletEvgadn 2022. 12. 30. 15:33

코딩 테스트 시 필요한 이유

모든 코딩 테스트를 보면 왜인지는 모르겠지만 답을 배열(int[], String[] 등)로 반환하라고 하는 경우가 많다.

 

하지만 개인적으로는 선언 시 미리 Size를 정해줘야 하는 배열보다는 Size 걱정 없이 데이터를 저장할 수 있는 Collection을 더 많이 활용하게 된다.

 

물론 Collection을 for문이나 for each문을 통해 모든 데이터를 순회하며 배열에 값을 넣어줘도 될 것이다.

(실제로 필자는 예전에 이런 방식으로 배열을 만들었다)

 

하지만 Stream을 사용한다면 데이터 순회에 걸리는 실행 시간을 조금이라도 줄일 수 있지 않을까 생각하여 정리해 보았다.


Collection to Array

◎ int가 아닌 Data Type int

  • String s : Integer.parseInt(String s)
  • Long l : l.intValue()
  • Double d : d.intValue()
  • long l : (int) l
  • double d : (int) d
  • Integer i : (int) i or i.intValue()

 

◎ Collection to int Array

// String Collection to int Array
List<String> sList = new ArrayList<>();
int[] sArr = sList.stream().mapToInt(i->Integer.parseInt(i)).toArray(); // 람다식
int[] sArr2 = sList.stream().mapToInt(Integer::parseInt).toArray();     // 메서드 레퍼런스

// Long Collection to int Array
List<Long> lList = new ArrayList<>();
int[] lArr = lList.stream().mapToInt(i->i.intValue()).toArray();        // 람다식
int[] lArr2 = lList.stream().mapToInt(Long::intValue).toArray();        // 메서드 레퍼런스

// Integer Collection to int Array
List<Integer> iList = new ArrayList<>();
int[] iArr = iList.stream().mapToInt(i->i).toArray();                   // 람다식
int[] iArr2 = iList.stream().mapToInt(Integer::intValue).toArray();     // 메서드 레퍼런스

// Double Collection to int Array
List<Double> dList = new ArrayList<>();
int[] dArr = dList.stream().mapToInt(i->i.intValue()).toArray();        // 람다식
int[] dArr2 = dList.stream().mapToInt(Double::intValue).toArray();      // 메서드 레퍼런스

// long Array to int Array
long[] longArr = new long[10];;
int[] intArr = Arrays.stream(longArr).mapToInt(l -> (int) l).toArray();

위 코드에서 "mapToInt" 메서드의 Parameter로써 위에서 설명한 Data Type별 int 형 데이터 변환 방법을 주입한 것을 볼 수 있다.

 

long[]은 mapToLong, double[]은 mapToLong을 대신 사용할 뿐 방법은 동일하므로 long[]과 double[]에 대해선 따로 기입하지 않겠다.


Array to Collection

◎ int → 다른 Data Type

  • String s : Integer.toString(s)
  • Long : Long.valueOf(s)
  • Double : Double.valueOf(d)

Collection은 Wrapper Class나 Reference Class만 T로 주입할 수 있으므로 위 3개만 알고 있으면 된다.

 

◎ int Array to Collection<T>

int[] intArr = new int[10];

// Integer Collection으로 치환
List<Integer> intList = Arrays.stream(intArr).boxed().collect(Collectors.toList());

// Long Collection으로 치환
Set<Long> longSet1 = Arrays.stream(intArr).mapToObj(i->Long.valueOf(i)).collect(Collectors.toSet()); // 람다식
Set<Long> longSet2 = Arrays.stream(intArr).mapToObj(Long::valueOf).collect(Collectors.toSet());      // 메서드 레퍼런스

// Double Collection으로 치환
List<Double> doubleList = Arrays.stream(intArr).mapToObj(i->Double.valueOf(i)).collect(Collectors.toList()); // 람다식
List<Double> doubleList2 = Arrays.stream(intArr).mapToObj(Double::valueOf).collect(Collectors.toList());     // 메서드 레퍼런스

// HashSet(Collection 중 특정 클래스)으로 치환
HashSet<Integer> hashSet = Arrays.stream(intArr).boxed().collect(Collectors.toCollection(HashSet::new));

mapToLong은 Wrapper Class인 "Long"이 아닌 Primitive 자료형 "long"으로 변환하기 위한 메서드이다.

따라서 Collection<T>에서 T로 들어갈 수 있는 Class 형태로 만들기 위해선 mapToObj를 활용해야 한다.

 

추가로 IntStream을 Stream<Integer>로 변경하기 위해선 boxed()를 사용하면 된다는 것을 배웠으므로 Long<Integer> 같은 경우에는 boxed() 메서드를 활용하면 된다.

 

마지막으로 Set<T>나 List<T>가 아닌 HashSet, ArrayList같이 Collection Class를 상세히 설정하고 싶을 때 Collectors.toCollection을 사용하면 된다.

 

long[], double[] 또한 비슷한 방법을 사용하면 되므로 따로 기입하지 않겠다.

'코딩 테스트 시 알면 좋은 것들' 카테고리의 다른 글

문자열 뒤집기  (0) 2023.01.03
Compare 관련 메소드  (0) 2022.12.31
log & 거듭제곱  (0) 2022.12.30
N 진법  (0) 2022.12.30
Long & Int 범위  (0) 2022.12.30
Comments