Scala에서의 대표적인 데이터 구조가 바로 Map입니다. 어느 프로그래밍 언어이건 간에 가장 대표적인 데이터 구조로 손꼽히는데, 먼저 이 Map에 데이터를 집어넣어 봅시다.
scala> val map = Map("a" -> 1, "b" -> 1, "c" -> 2) map: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 1, c -> 2)
Functional Programming에 본격적으로 들어가면서부터 Immutable, 즉 변형 불가능한 데이터 구조들이 등장하기 시작합니다. 일단은 여기서 깊이 들어가지는 않고 넘어가겠습니다.
일단은 Map 자체로는 정렬을 할 수가 없습니다. 따라서 Map을 (key, value)의 tuple 형태로 List로 먼저 뽑아내야 합니다. 이는 toSeq
로 쉽게 변경할 수 있습니다.
scala> map.toSeq res3: Seq[(String, Int)] = ArrayBuffer((a,1), (b,1), (c,2))
만약 이 Tuple을 Value 기준으로 내림차순, Key 기준으로 오름차순으로 정렬하고 싶다면,
scala> map.toSeq.sortWith((t1, t2) => if (t1._2 == t2._2) t1._1 < t2._1 else t1._2 > t2._2) res2: Seq[(String, Int)] = ArrayBuffer((c,2), (a,1), (b,1))
이렇게 Secondary Sort를 자유 자재로 줄 수 있습니다.
함수 내용을 간단히 설명하면, 두 개의 비교할 tuples, 즉 t1과 t2를 가지고 value(._2)가 같다면 key(._1)를 기준으로 오름차순 정렬하고, 나머지 경우에 대해서는 value를 기준으로 내림차순 정렬하는 함수입니다 🙂
가장 간단하면서도 가장 필수적인 스킬중의 하나입니다.