zip 메소드는 리스트를 순환하면서 리스트 튜플을 만든다. (내부적으로 iterator 객체를 포함할 때만 동작한다)
zipWithIndex는 따로 List를 주지 않아도 자동으로 0부터 시작하는 list와 합치도록 해준다.
Stream from 0 은 0부터 시작하는 리스트를 리턴한다.
unzip은 만어진 리스트 튜플을 다시 리스트 객체로 쪼개주는 역할을 한다. unzip._1은 다시 원래의 list로 리턴하는 메소드이다.
val list = List(1,2,3,4,5)
println(list.zipWithIndex)
println(list.zip(Stream from 0))
println(list.zip(Stream from 0).unzip._1)
결과는 다음과 같다.
List((1,0), (2,1), (3,2), (4,3), (5,4))
List((1,0), (2,1), (3,2), (4,3), (5,4))
List(1, 2, 3, 4, 5)
문자열도 동일하게 동작한다.
scala에서는 메소드르 사용할 때 꼭 내부 함수를 의미하는 .나 괄호를 쓰지 않아도 되는 경우가 있다. 마치 수학 연산 같은 느낌을 주기 위해 다음과 같이 List zip List 형태로 쓸 수 있다.
zip, unzip, toMap 메소드 예시를 실행해 본다.
val zipped = List("A", "B") zip List("C", "D")
println(zipped)
println(zipped.unzip)
println(zipped.toMap)
결과는 다음과 같다.
List((A,C), (B,D))
(List(A, B),List(C, D))
Map(A -> C, B -> D)
만약 엘리먼트가 하나가 더 큰 상황에서 zip메소드를 호출하면 긴 엘리먼트 쪽 데이터는 zip 메소드에서 사용하지 않는다.
val zips = List("A", "B") zip List("C")
println(zips)
결과는 다음과 같다.
List((A,C))
두 개 뿐 아니라 세 개의 튜플을 가지는 리스트 객체를 생성할 수도 있다.
println((List(1,2,3,4,5), List(0,1,2,3,4)).zipped.toList)
println((List(1,2,3,4,5), List(0,1,2,3,4), List(10,11,12,13,14)).zipped.toList)
결과는 다음과 같다.
List((1,0), (2,1), (3,2), (4,3), (5,4))
List((1,0,10), (2,1,11), (3,2,12), (4,3,13), (5,4,14))
'scala' 카테고리의 다른 글
[scala] List 정의와 예시 (0) | 2016.09.13 |
---|---|
[scala] Array 예시 (0) | 2016.09.12 |
[scala] Map의 transform, map, mapValues 예시, mapValues와 transform의 차이점 (0) | 2016.09.09 |
[scala] groupBy, distinct, sortWith, sortBy 예시 (0) | 2016.09.09 |
[scala] grouped와 sliding (0) | 2016.09.09 |