프로그래밍 언어/Kotlin

List를 Map으로 만들기: associate

Julie825 2022. 11. 26. 00:32

Kotlin의 associate 메서드를 사용한다. 일단 사용 예시부터 보자.

    val list = listOf<Int>(1, 2, 3)

    val exp1 = list.associateWith { "value" } // [1:value, 2:value, 3:value]
    val exp2 = list.associateBy { "key" } // [key: 1, key: 2. key: 3] -> [key: 3] 이 됨
    val exp3 = list.associateBy { it } // [1: 1, 2: 2, 3: 3]
    val exp4 = list.associateBy({ it }, { "숫자$it" }) // [1: 숫자1, 2: 숫자2, 3: 숫자3]

 

1. associateWith ( valueSelector )

key = 리스트에 있던 값, value = 사용자가 만들어낸 값

 

리스트의 값을 그대로 Key로 사용할 때 사용한다. valueSelector로는 람다함수를 넘길 수 있다. 반환타입은 자유다.

exp1에서 { "value" }가 (Unit) -> Strin 타입의 람다함수여서 value 값이 모두 고정되었다.

원한다면 아래와 같이 key 값을 사용해서 value를 구성할 수 있다

list.associateWith { "숫자$it" } // [1: 숫자1, 2: 숫자2, 3: 숫자3]

 

2. associateBy ( keyselector )

key = 사용자가 만들어낸 값, value = 리스트에 있던 값

 

리스트의 값을 value로 가지게 하고싶을 때 사용한다. keySelector로는 람다함수를 넘길 수 있다.

list.associateBy { "key" } // [key: 1, key: 2. key: 3] -> [key: 3] 이 됨

map 자료형은 키값의 중복을 허용하지 않으므로 위 코드에서는 계속 value 값만 갱신되어서 맵의 크기가 1이 되었다.

list.associateBy { it } // [1: 1, 2: 2, 3: 3]

valueSelector와 마찬가지로 keySelector의 반환타입도 자유이며, 람다함수에 리스트의 원래 값을 사용할 수 있다.

 

3. associateBy ( keySelector, valueSelector )

key = 사용자가 만들어낸 값, value = 사용자가 만들어낸 값

 

리스트의 값에서 각각 key와 value를 만들어내서 넣어줄 때 사용한다. 위 함수와 이름이 같다(오버로딩됨)

list.associateBy({ it }, { "숫자$it" })

keySelector 람다함수와 valueSelector 람다함수를 둘 다 넣어서 사용할 수 있다.

val list = listOf(User("kim", 25), User("lee", 27))
list.associateBy({ it.name }, { it.age })

위 예시처럼 복잡한 객체를 맵으로 만들 때 사용하면 좋다.

 


Map을 정렬하고싶을 때는 LinkedHashMap을 사용하자.