如果不相等,kotlin地图的增加值

我有一个val valuesMap = mutableMapOf()如果map的键不等于IgnoreCase的新值,我想添加新的值。

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

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

为什么不为你的用例使用一个特定的地图:

 val caseInsensitive = TreeMap(String.CASE_INSENSITIVE_ORDER) 

这里使用下面的构造函数:

公共TreeMap(比较比较器)

根据给定的比较器构造一个新的空树映射。 所有插入到映射中的键都必须可以通过给定的比较器进行相互比较:comparator.compare(k1,k2)不能为映射中的任何键k1和k2抛出ClassCastException。 如果用户试图把一个关键字放入违反这个约束的映射中,put(Object key,Object value)调用将抛出一个ClassCastExceptionexception。

参数 :比较器 – 将用于排序该映射的比较器。 如果为null,则将使用键的自然排序。

这遍历密钥集并将低位键与给定的项(新密钥)进行比较。

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

你需要使用containsKey()

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

编辑1根据评论中的链接 ,你可以使用

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

如果你想添加一个低于上一个键的键值,那么你可以使用一个谓词来应用一个filter,这个谓词会使所有的键都小写。 如果谓词不返回任何结果,则可以插入该对,否则不能。

沿线的东西:

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

这是一个运行的代码示例:

 fun main(args: Array) { val map = mutableMapOf(Pair("k1", "v1"), Pair("K2", "v2")) addIfNotLowerExists(map, Pair("k2", "v2_1")) addIfNotLowerExists(map, Pair("k3", "v3")) println(map) } private fun addIfNotLowerExists(map: MutableMap, candidate: Pair) { 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已经在地图中。

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

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