首页 > 解决方案 > 检查 map 是否包含子字符串。科特林

问题描述

我有一个

val map = Map<String,String>
map.put("Nurseiyt","android")

我想通过 subString 获取一个值,例如:

map["Nurs"]应该返回"android"

可能吗?

标签: kotlinhashmap

解决方案


使用 kotlin.Collections,有类似filter.

两件事 - 最好使用正则表达式。因此,您甚至可以更好地控制将返回的内容。第二个,可以有多个元素与该正则表达式匹配。所以这就是我返回列表的原因。

fun <T> substringKey(map: Map<String, T>, regex: Regex): List<T> {
    return map.filter { it.key.contains(regex) }
        .map { it.value }
}

如果您想使用该符号,您需要创建自己的地图并覆盖正确的运算符。值得注意的是,你不能返回值列表。所以,在这种情况下,我只返回第一个找到的值。

class SubstringMap<V> : HashMap<String, V>() {
    override operator fun get(key: String): V? {
        return this.entries.first { it.key.contains(key) }.value
    }
}

fun main() {
    val map = SubstringMap<String>()
    map["Nurseiyt"] = "android"
    println(map["Nurs"]) // "android"
}

最后一件事 - 在 kotlin 中,您可以创建自己的运算符,例如withKeyPart. 这比重写默认运算符要好得多(因为我不希望该[]运算符以与平时不同的方式工作。

infix fun <V> Map<String, V>.withKeyPart(keyPart: String): List<V> {
    return this.filter { it.key.contains(keyPart) }
        .map { it.value }
}

然后这样称呼它:

fun main() {
    val map = HashMap<String, String>()

    map withKeyPart "KeyPart" // infix notation
    map.withKeyPart("KeyPart") // standard call
}

推荐阅读