Study(종료)/Kotlin 22.09.13 ~ 12.18

7-1 컬렉션과 I/O 자세히 알아보기 : 컬렉션 타입(3)

Ski_ 2022. 10. 30. 00:22

7장

7-1. 컬렉션과 I/O 자세히 알아보기 : 컬렉션 타입 (1) (7-1.1~ 7-1.4)

7-1. 컬렉션과 I/O 자세히 알아보기 : 컬렉션 타입 (2) ( 7-1.5~ 7-1.7 )

7-1. 컬렉션과 I/O 자세히 알아보기 : 컬렉션 타입 (3) ( 7-1.8~ 7-1.11 )

7-2. 컬렉션과 I/O 자세히 알아보기 : 파일과 I/O 스트림


7-1. 컬렉션

 

9) 변환

코틀린 표준 라이브러리는 컬렉션의 모든 원소를 주어진 큐직에 따라 변경한 뒤

정해진 방식으로 조합하여 새로운 컬렉션을 만들어내는 변환 함수를 제공한다.

이 함수는 mapping, flattening, association 세가지 유형으로 나눌 수 있다.

 

1) mapping

  매핑 변환은 주어진 함수를 원본 컬렉션의 원소에 각각 적용한다. 그리고 적용한 결과는 새로운 컬렉션의 원소가 된다.

  이 유형에 속하는 기본 함수는 map()이며, 모든 컬렉션 객체가 이 함수를 제공한다.

val list2 = listOf("a", "b", "c", "d")
println(list2.map { it + it }) // [aa, bb, cc, dd]

  변환 시 인덱스를 고려해야 하는 경우 mapIndexed() 함수를 사용할 수 있다.

  맵 변환 후 not-null인 값만 선택해 사용하고 싶은 경우 mapNotNull() 함수를 사용할 수 있다.

 

2) flattening(평평하게 하기 라고 번역됨)

  각각의 컬렉션을 이어 붙인 한 컬랙션을 반환하며  원소가 컬렉션인 모든 컬렉션에 적용할 수 있다.

val list1 = listOf(1, 2, 3, 4)
println(listOf(list1).flatMap { it.asIterable() }) // [1, 2, 3, 4]

 

3) association(연관짓기 라고 번역됨)

  컬렉션의 원소를 사용해 Key와 Value를 만들어낸다.

val list2 = listOf("apple", "banana", "car", "dinner")
println(listOf(list2.associate { it to it.length })) // [{apple=5, banana=6, car=3, dinner=6}]

10) 하위 컬렉션 추출

  • slice() / sliceArray()
    • 리스트나 배열 원소를 정수 범위를 이용해 일부를 추출
    • sliceArray()는 결과값이 배열로 반환
  • take() / takeLast()
    • 이터러블이나 배열에서 원소를 주어진 개수만큼 추출
    • take()는 앞에서부터, takeLast()는 뒤에서부터 주어진 개수만큼 추출
    • 조건식을 추가해 만족하는 원소만 추출 가능
  • drop() / dropLast()
    • take(), takeLast()를 반전시킨 연산
    • 주어진 개수만큼 원소를 제외한 나머지 원소를 추출
    • 조건식을 추가해 만족하는 원소만 추출 가능

11) 순서

컬렉션 원소를 정해진 순서에 따라 정렬(sorting)하는 함수가 들어 있다.

가장 간단한 형태는 sorted() 함수이며 비교 가능한 배열/이터러블/시퀸스에 적용할 수 있으며 오름차순으로 정렬한다.

내림차순으로 정렬하고 싶은 경우 sortedDescending() 함수를 사용한다.

val list1 = listOf(5, 2, 1, 3, 4)
println(list1.sorted()) // [1, 2, 3, 4, 5]
println(list1.sortedDescending()) // [5, 4, 3, 2, 1]

컬렉션 원소가 비교가 불가능해도 순서를 제공함으로써 sorted()를 대체할 수 있다.

sortedBy()나 sortedWith() 함수를 이용하면 비교가 불가능한 컬렉션을 정렬할 수 있다.

class Person(
    val firstName: String,
    val familyName: String,
    val age: Int
    ){
    val fullName get() = "$firstName $familyName"
    override fun toString() = "$firstName $familyName : $age"
}

val FULL_NAME_COMPARATOR = kotlin.Comparator<Person>{ p1, p2 -> p1.fullName.compareTo(p2.fullName)}

fun main(){

    val persons = listOf(
        Person("Brook", "Hudson", 25),
        Person("Silver", "SonHud", 21),
        Person("Gold", "Han", 35),
        Person("Iron", "Kim", 20),
    ).sortedWith(FULL_NAME_COMPARATOR)
    println(persons) // [Brook Hudson : 25, Gold Han : 35, Iron Kim : 20, Silver SonHud : 21]
}

다음글

7-2. 컬렉션과 I/O 자세히 알아보기 : 파일과 I/O 스트림

 

 

반응형