2017-03-18 109 views
0

我正在尝试使用Kotlin在更实用的样式中遍历嵌套的Hashmap。特别是,我有两个HashMap实例(都是Map<String, Integer>),我想根据一些标准匹配它们的值。这里是什么,我要实现的Java方法:如何在Kotlin的嵌套Hashmap迭代中使用`filterValues`?

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; 

这里是我的科特林在功能上等同的尝试:

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的正确解决方案是什么样的?

回答

0

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

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

你可以重写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; 

这更短,并做同样的事情。

但是,由于外部地图pairscontainsKey检查,它仍然是有状态的。

我想知道什么,虽然该函数的预期产出将是在这种情况下:

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

您可以加入预期的结果?我觉得这个功能有缺陷。