Kotlin里有多重Map吗?

rur96b6h  于 2023-01-31  发布在  Kotlin
关注(0)|答案(5)|浏览(142)

我需要像这样在Map中存储值:

val map = HashMap<String, Set<String>>()

但是很难与Map内的集合交互。
Kotlin中是否有Multimap in Google Guava这样的多Map实现?

6ljaweal

6ljaweal1#

不,目前没有,将来也可能没有。
参考:https://discuss.kotlinlang.org/t/the-standard-library-and-a-kotlin-manifesto/1303/6
备选方案:

org.springframework.util.MultiValueMap
org.apache.commons.collections4.MultiMap
com.google.common.collect.Multimap

要使用示例中的Set,您可以:

map["key"].forEach(::println)

或者别的什么。

mm9b1k5b

mm9b1k5b2#

但是很难与Map内的集合交互。
这并不难,例如:

val map = HashMap<String, MutableSet<String>>()
map.getOrPut("howdy") { mutableSetOf() }.add("world")
wkyowqbh

wkyowqbh3#

您还可以用途:val myMap = LinkedMultiValueMap<String, String>().apply {add("Hello", "World")}

flvtvl50

flvtvl504#

如果您在JVM和Spring上使用Kotlin:您可以将collectionUtils用于MultivalueMap:你也可以得到一个不可修改的类型这实际上只是在修改时抛出UnsupportedOperationException

val myMap = mapOf("1" to listOf(1,2,3))
CollectionUtils.unmodifiableMultiValueMap(CollectionUtils.toMultiValueMap(myMap))
omjgkv6w

omjgkv6w5#

对于基本的使用,像这样的东西可以很方便:

class MutableMultimap<K, V> {
    private val map: MutableMap<K, MutableSet<V>> = HashMap()
    operator fun get(key: K): Set<V> = map[key] ?: emptySet()
    operator fun contains(key: K): Boolean = map.containsKey(key)
    fun contains(key: K, value: V): Boolean = map[key]?.contains(value) ?: false

    fun add(key: K, value: V) : Boolean {
        return map.getOrPut(key) { mutableSetOf() }.add(value)
    }

    fun remove(key: K, value: V): Boolean {
        val values = map[key] ?: return false
        val removed = values.remove(value)
        if (values.isEmpty())
            map.remove(key)
        return removed
    }
}

当然,对此的各种优化当然是可能的。

相关问题