Kotlin에서 List를지도로 변환하는 방법?


169

예를 들어 다음과 같은 문자열 목록이 있습니다.

val list = listOf("a", "b", "c", "d")

문자열이 키인지도로 변환하고 싶습니다.

나는 그 .toMap()기능을 사용해야한다는 것을 알고 있지만 그 방법을 모르겠으며 그 예를 보지 못했습니다.

답변:


317

두 가지 선택이 있습니다.

첫 번째이자 가장 성능이 좋은 것은 associateBy키와 값을 생성하기 위해 두 개의 람다 를 사용 하고 맵 생성을 인라인하는 함수 를 사용하는 것입니다.

val map = friends.associateBy({it.facebookId}, {it.points})

두 번째로 성능이 떨어지는 두 번째는 표준 map함수를 사용 하여 최종 맵을 생성하는 Pair데 사용할 수 있는 목록을 작성하는 것입니다 toMap.

val map = friends.map { it.facebookId to it.points }.toMap()

1
감사합니다. 지도와 같이 쌍 목록을 맵으로 변환하지 않기 때문에 더 빠릅니까?
LordScone

4
@lordScone 정확히, Pair인스턴스 의 할당은 큰 컬렉션에 매우 비용이 많이들 수 있습니다.
voddan

41

에서 ListMapassociate기능

Kotlin 1.3 List에는이라는 함수가 associate있습니다. associate다음과 같은 선언이 있습니다.

fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>

리턴 Map의해 제공 함유 키 - 값 쌍 transform함수는 주어진 컬렉션의 요소에 적용.

용법:

class Person(val name: String, val id: Int)

fun main() {
    val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
    val map = friends.associate({ Pair(it.id, it.name) })
    //val map = friends.associate({ it.id to it.name }) // also works

    println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}    

에서 ListMapassociateBy기능

Kotlin List에는이라는 기능이 associateBy있습니다. associateBy다음과 같은 선언이 있습니다.

fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>

지정된 컬렉션의 요소에 적용 되는 함수에 의해 Map제공되고 valueTransform색인화 된 값을 포함 하는를 반환합니다 keySelector.

용법:

class Person(val name: String, val id: Int)

fun main() {
    val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
    val map = friends.associateBy(keySelector = { person -> person.id }, valueTransform = { person -> person.name })
    //val map = friends.associateBy({ it.id }, { it.name }) // also works

    println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}

3
Associate와 AssociateBy의 차이점은 무엇입니까? 동일한 결과를 얻는 것을 보면서 다른 것을 사용하고 싶습니까?
waynesford

11
  • 반복 가능한 시퀀스 요소를 kotlin의 맵으로 변환
  • 동료 대 동료로

* 참고 : Kotlin 설명서

1- 연관 (키와 값 모두 설정) : 키와 값 요소를 설정할 수있는 맵을 작성하십시오.

IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}

두 쌍 중 하나가 동일한 키를 가지면 마지막 키가 맵에 추가됩니다.

반환 된 맵은 원래 배열의 항목 반복 순서를 유지합니다.

2- AssociateBy (계산으로 키 설정) : 새 키를 설정할 수있는 맵을 작성하면 비슷한 요소가 값으로 설정됩니다.

IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set  from analogous IterableSequenceElements' ,...}

3- AssociateWith (계산으로 값을 설정) : 새로운 값을 설정할 수있는 맵을 작성하면 유사한 요소가 키에 설정됩니다

IterableSequenceElements.associateWith { newValue }  //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}

Kotlin 팁의 예 : 여기에 이미지 설명을 입력하십시오


10

associate이 작업에 사용할 수 있습니다 :

val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }

이 예에서 문자열 list은 키가되고 해당 길이 (예 :)는 맵 내부의 값이됩니다.


7

목록에 잃고 싶지 않은 사본 이있는 경우을 사용하여이 작업을 수행 할 수 있습니다 groupBy.

그렇지 않으면 다른 사람들이 말했듯이 사용하십시오 associate/By/With(중복의 경우 그 키로 마지막 값만 반환한다고 믿습니다).

연령별로 사람 목록을 그룹화하는 예 :

class Person(val name: String, val age: Int)

fun main() {
    val people = listOf(Person("Sue Helen", 31), Person("JR", 25), Person("Pamela", 31))

    val duplicatesKept = people.groupBy { it.age }
    val duplicatesLost = people.associateBy({ it.age }, { it })

    println(duplicatesKept)
    println(duplicatesLost)
}

결과 :

{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}

0

RC 버전에서 변경되었습니다.

나는 사용하고있다 val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.