2017-03-18 14 views
0

私は、Kotlinを使ってより機能的なスタイルで入れ子になったハッシュマップを反復しようとしています。特に、2つのHashMapインスタンス(どちらもタイプMap<String, Integer>)があり、いくつかの基準に基づいて値を一致させたいと思います。ここで私が達成したいもののJavaメソッドは次のとおりです。ここでKotlinのネストされたハッシュマップ反復で `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; 

は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のように見えますか?

答えて

0

ここで問題となるのは、ステートフルフィルタであり、最終結果に要素を配置するかどうかは、処理された前の要素によって決まることを意味します。機能フィルタはステートレスでなければならないので、要素を追加するかどうかは要素の処理順序に関係なく同じです。

しかし、私はロジック全体が少し冗長だと思う。

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; 

はるかに短いと同じことを行います

は、次のようなJavaのバージョンを書き換えることができます。

外部マップ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 

あなたは期待どおりの結果を追加してもらえますか?機能に欠陥があるという印象があります。

関連する問題