【问题标题】:kotlin map add value if doesn't equalkotlin map 如果不等于则添加值
【发布时间】:2017-12-15 08:03:21
【问题描述】:

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

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

类似这样的东西,但在 kotlin 中,我们只有 equals 方法用于键。

【问题讨论】:

  • 您确定地图是这里的最佳选择吗?看起来您正在将其用作数组。
  • 为什么不使用 hashset 代替唯一条目?

标签: android kotlin


【解决方案1】:

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

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)
}

【讨论】:

    【解决方案2】:

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

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

    这里使用以下构造函数:

    公共 TreeMap(Comparator 比较器)

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

    参数: 比较器 - 将用于订购此地图的比较器。如果为 null,则将使用键的自然顺序。

    【讨论】:

    【解决方案3】:

    你需要使用containsKey()

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

    编辑 1 根据评论中的link,可以使用

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

    【讨论】:

    • 那么 containsIgnoreCase 呢?
    • 如果你想使用不区分大小写的可变映射,你可以查看github.com/jkcclemens/khttp/blob/master/src/main/kotlin/khttp/…。但是地图没有 containsIgnoreCase 方法。因为对于String 键,String 的每个组合都是不同的键。例如; “Value”、“VALue”、“value”是不同的键。
    【解决方案4】:

    如果您想添加一个小写的键还没有在映射中,您可以使用一个谓词对键应用过滤器,该谓词将所有键都小写。如果谓词没有返回结果,您可以插入该对,否则不返回。

    类似的东西:

    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 已在映射中。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多