2017-03-18 107 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 

您可以加入預期的結果?我覺得這個功能有缺陷。