我有val valuesMap = mutableMapOf<String, String>()
如果map的键不是equalsIgnoreCase新值,我想添加新值。
if(!valuesMap.keys.equalsIgnoreKeys("value")) {
valuesMap.put("value", null)
}
像这样的东西,但在kotlin我们只有等于键的方法。
答案 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)