如果不相等,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)