kotlin map如果不相等则增加值

时间:2017-12-15 08:03:22

标签: android kotlin

我有val valuesMap = mutableMapOf<String, String>() 如果map的键不是equalsIgnoreCase新值,我想添加新值。

if(!valuesMap.keys.equalsIgnoreKeys("value")) {
 valuesMap.put("value", null)
}

像这样的东西,但在kotlin我们只有等于键的方法。

5 个答案:

答案 0 :(得分:4)

这会遍历键集并将低位键与给定术语(新键)进行比较。

val map: MutableMap<String, String?> = mutableMapOf()
val term = "value"
val contains = map.keys.any { key ->
    key.toLowerCase() == term.toLowerCase()
}
if (!contains) {
    map.put(term, null)
}

答案 1 :(得分:2)

您需要使用containsKey()

if (!valuesMap.containsKey("value")) {
    valuesMap.put("value", null)
}

修改1 根据{{​​3}}的评论,您可以使用

String valueByKey = valuesMap.filter { 
                                it.key.equals("keyValue", ignoreCase = true) 
                             }.map { it.key }.firstOrNull()
if(valueByKey==null){
    valuesMap.put("keyValue", null)
}

答案 2 :(得分:2)

为什么不为您的用例使用特定的地图:

val caseInsensitive = TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER)

此处使用以下构造函数:

  

公共TreeMap(比较器比较器)

     

构造一个新的空树图,根据给定的比较器排序。插入映射的所有键必须由给定的比较器相互比较:comparator.compare(k1,k2)不得为映射中的任何键k1和k2抛出ClassCastException。如果用户试图将键放入违反此约束的映射中,则put(Object key,Object value)调用将抛出ClassCastException。

     

<强>参数:       比较器 - 将用于对此映射进行排序的比较器。如果为null,则将使用键的自然顺序。

答案 3 :(得分:2)

如果你想在地图中添加一个低位的键,你可以使用谓词来对键进行过滤,这样可以降低所有键的大小。如果谓词没有返回结果,则可以插入该对,否则不会。

有些事情:

private fun addIfNotLowerExists(map: MutableMap<String, String>, candidate: Pair<String, String>) {
    if (map.filter { s -> s.key.toLowerCase().equals(candidate.first.toLowerCase()) }.keys.isEmpty()) {
        map[candidate.first] = candidate.second
    }
}

以下是代码的运行示例:

fun main(args: Array<String>) {
    val map = mutableMapOf<String, String>(Pair("k1", "v1"), Pair("K2", "v2"))
    addIfNotLowerExists(map, Pair("k2", "v2_1"))
    addIfNotLowerExists(map, Pair("k3", "v3"))
    println(map)
}

private fun addIfNotLowerExists(map: MutableMap<String, String>, candidate: Pair<String, String>) {
    if (map.filter { s -> s.key.toLowerCase().equals(candidate.first.toLowerCase()) }.keys.isEmpty()) {
        map[candidate.first] = candidate.second
    }
}

打印出来:

{k1=v1, K2=v2, k3=v3}

正如您所看到的,未插入值{k2:v2_1},因为 K2 键已在地图中。

答案 4 :(得分:1)

我建议在地图中只使用小写键,否则你可以这样做

valuesMap.keys.map { it.toLowerCase() }.find { it == "value".toLowerCase() } ?: valuesMap.put("value", null)