【问题标题】:How do I use `filterValues` on Nested Hashmap Iteration in Kotlin?如何在 Kotlin 的嵌套 Hashmap 迭代中使用“filterValues”?
【发布时间】:2017-03-18 09:04:54
【问题描述】:

我正在尝试使用 Kotlin 以更实用的样式迭代嵌套的 Hashmap。特别是,我有两个 HashMap 实例(均为Map<String, Integer> 类型),我想根据某些标准匹配它们的值。这是我想要实现的Java方法:

Map<Integer, Integer> pairs = new LinkedHashMap<>();
for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) {
    for (Map.Entry<String, Integer> newImages : finalImageMap.entrySet()) {
        Integer oldImageVal = oldImages.getValue();
        Integer newImageVal = newImages.getValue();

        boolean containsNewType = pairs.containsKey(newImageVal) &&
                pairs.get(newImageVal).intValue() == oldImageVal.intValue();

        boolean urlsMatch = newImages.getKey().equals(oldImages.getKey());

        if (!containsNewType && urlsMatch) {
            pairs.put(oldImageVal, newImageVal);
        }
    }
}

return pairs;

这是我在 Kotlin 中的等效功能尝试:

private val swapPairs: Map<Int, Int>
    get() {
        val pairs = LinkedHashMap<Int, Int>()

        startingImageMap.forEach {
            val finalImageMap = finalImageMap.filterValues {
                val containsNewType = pairs.containsKey(it) && pairs[it] == startingImageMap[it]
                val urlMatch = it == startingImageMap[it]

                return !containsNewType && urlsMatch
            }.values.first()     
        }
        return pairs
    }

我不知道如何使用filterValues 正确执行此操作。 Kotlin 中的正确解决方案是什么样的?

【问题讨论】:

    标签: java functional-programming hashmap kotlin


    【解决方案1】:

    这里的问题是这是一个有状态的过滤器,这意味着将元素放入最终结果的决定取决于先前处理的元素。功能过滤器应该是无状态的,因此无论元素的处理顺序如何,添加元素的决定都是相同的。

    但是,我认为整个逻辑有点冗长。

    你可以像这样重写 Java 版本:

    Map<Integer, Integer> pairs = new LinkedHashMap<>();
    
    for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) {
      Integer oldImageVal = oldImages.getValue();
      Integer newImageVal = finalImageMap.get(oldImages.getKey());
    
      if (newImageVal != null) {
        boolean containsNewType = pairs.containsKey(newImageVal) &&
            pairs.get(newImageVal).intValue() == oldImageVal.intValue();
    
        if (!containsNewType) {
          pairs.put(oldImageVal, newImageVal);
        }
      }
    }
    
    return pairs;
    

    哪个更短并且做同样的事情。

    然而,由于外部映射 pairs 正在与 containsKey 进行检查,因此它仍然是有状态的。

    我想知道在这种情况下函数的预期输出是什么:

       old       new
      A: 1       A: 5
      B: 2       B: 2
      C: 3       C: 3
      D: 4       E: 8
      H: 9       F: 9
                 G: 3
    

    你能添加预期的结果吗?我觉得这个功能有缺陷。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多