如何在Kotlin中反转地图?

Grz*_*rek 11 dictionary bimap kotlin

我试图扭转Kotlin的地图.到目前为止,我想出了:

mapOf("foo" to 42)
  .toList()
  .map { (k, v) -> v to k }
  .toMap()
Run Code Online (Sandbox Code Playgroud)

没有使用中间人(中间名单)有没有更好的方法呢?

hol*_*ava 26

因为它Map是由Entrys 组成而不是a Iterable.但您可以使用Map#条目,它将映射到Map#entrySet以创建支持的视图Set<Entry>,例如:

val reversed = map.entries.associateBy({ it.value }) { it.key }
Run Code Online (Sandbox Code Playgroud)

或者使用Iterable#associate,但它会创建额外的Pairs.

val reversed = map.entries.associate{(k,v)-> v to k}
Run Code Online (Sandbox Code Playgroud)

或者使用Map#forEach代替.例如:

val reversed = mutableMapOf<Int, String>().also {
    //     v-- use `forEach` here     
    map.forEach { (k, v) -> it.put(v, k) } 
}.toMap()
// ^--- you can add `toMap()` to create an immutable Map.
Run Code Online (Sandbox Code Playgroud)

  • 所以回答"没有使用中间人(中间名单)有没有更好的办法?" 答案是不?:P (2认同)

ben*_*nyl 5

这是一个反转映射的简单扩展函数 - 不会产生不需要的垃圾(如对、中间数据结构和不必要的闭包)

fun <K, V> Map<K, V>.reversed() = HashMap<V, K>().also { newMap ->
    entries.forEach { newMap.put(it.value, it.key) }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它apply是内联的,entries.forEach也是内联的(这与 不同Map::forEach