如何在 Kotlin 的哈希映射中允许重复的键?

5
我需要一份Kotlin代码,用于实现允许重复键的哈希表。
class HashMap<K, V> : MutableMap<K, V>

请问您能具体说明一下吗?您想要构建什么?为什么需要重复的映射键? - Egor
2
地图不能有重复的键。请使用MutableList<Pair<K,V>>MutableMap<K,MutableList<V>>代替。 - Tenfour04
我有一个键值列表,其中有重复的键。 - hagar Mohamad
1
将重复键的值映射到与公共键相关联的列表值。 - Fureeish
@Tenfour04 你能解释一下吗?列表大概长这样 {test:physics,test:math,quiz:lab}。 - hagar Mohamad
当您在“map”中查找其中一个重复的键(例如,在您的示例中为“test”)时,您希望得到什么结果? - gidds
2个回答

7
您可以通过包含 PairList 来实现您想要的功能:
val mapWithDuplicateKeys = listOf(
            KEY1 to VALUE1
            KEY1 to VALUE2
            KEY2 to VALUE3
    )

或者直接将其添加到列表中:

val mapWithDuplicateKeys=mutableListOf<Pair<String,String>>()
mapWithDuplicateKeys.add(KEY1 to VALUE1)
mapWithDuplicateKeys.add(KEY1 to VALUE2)
mapWithDuplicateKeys.add(KEY2 to VALUE3)

检查是否包含某些条目的代码示例如下:

mapWithDuplicateKeys.any { it.first==KEY1 && it.second==VALUE1 } //true
mapWithDuplicateKeys.any { it.first==KEY1 && it.second==VALUE3 } //false

删除条目的操作就像:

mapWithDuplicateKeys.removeIf { it.first == KEY1 && it.second == VALUE1 }

获取条目的方式如下:

val valuesMatchingKEY1 = mapWithDuplicateKeys.filter { it.first== KEY1 }.map{it.second}

当然,您总是可以创建一个新类并使用简单的方法包装上述所有功能 :)


2
假设您的键和值都是字符串,您可以创建一个MutableMap<String,MutableList<String>>
val eventsBySubject = mutableMapOf<String, MutableList<String>>()

// Adding a value "physics" for key "test":
eventsBySubject.getOrPut("test", ::mutableListOf).add("physics")

// Getting all the values for a key "quiz":
val quizzes: List<String> = eventsBySubject["quiz"].orEmpty()

// Removing a single value "lab" for key "test":
eventsBySubject["test"]?.remove("lab")

根据您的需求,您还可以将键类型设置为MutableSet。 - Tenfour04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接