2016-05-30 10 views
0

の値として1のキーでハッシュマップJavaは、私は2つのマップを持っている他の

for each entry in map1 { 
    map3.put(entry.getKey(), map2.get(entry.getValue())) 
} 

理想的には、Java 7に準拠したソリューションに感謝します。が、Java 8との巧妙な1が

おかげ

+1

Streamチュートリアルhttps://docs.oracle.com/javase/tutorial/collections/streams/を参照してください。ストリームAPIを使用してこれらの基本操作を行う方法を教えてください。 – Tunaki

答えて

3

教育目的のために良いでしょう。ここにこれを行いますのJava 8の方法があります:必要に応じて

public static <K1, K2, V> Map<K1, V> java8Version(Map<K1, K2> first, Map<K2, V> second) { 
    return first.entrySet() 
    .stream() 
    .filter(e -> second.containsKey(e.getValue())) 
    .collect(Collectors.toMap(Map.Entry::getKey, e -> second.get(e.getValue()))); 
} 

を最適化し、nullチェックを追加します。

そして、ここでのJava 7バージョンです:それはそのコストについてより理解し、より正直だとして

public static <K1, K2, V> Map<K1, V> java7Version(Map<K1, K2> first, Map<K2, V> second) { 
    HashMap<K1, V> result = new HashMap<>(Math.min(first.size(), second.size())); 
    for (Map.Entry<K1, K2> entry : first.entrySet()) { 
    if (second.containsKey(entry.getValue())) 
     result.put(entry.getKey(), second.get(entry.getValue())); 
    } 
    return result; 
} 

私は、私より良いJavaの7バージョンのような推測が。

あなたはこれらのバージョンを使用し、その後、彼らは第二に存在しない場合でも、最初のマップからキーを保つ(またはのオプションを持っている)にしたい場合:

public static <K1, K2, V> Map<K1, V> java8VersionWithNulls(Map<K1, K2> first, Map<K2, V> second, boolean keepNulls) { 
    return first.entrySet() 
    .stream() 
    .filter(e -> keepNulls || second.containsKey(e.getValue())) 
    .collect(Collectors.toMap(Map.Entry::getKey, e -> second.get(e.getValue()))); 
} 

public static <K1, K2, V> Map<K1, V> java7VersionWithNulls(Map<K1, K2> first, Map<K2, V> second, boolean keepNulls) { 
    HashMap<K1, V> result = new HashMap<>(second.size()); 
    for (Map.Entry<K1, K2> entry : first.entrySet()) { 
    if (keepNulls || second.containsKey(entry.getValue())) 
     result.put(entry.getKey(), second.get(entry.getValue())); 
    } 
    return result; 
} 

しかし、個人的に私が言うと思いますそれをしないでください。ヌルは悪です。

上記のすべてが熱心な評価を使用します。静的な輸入品で、

public static <K1, K2, V> Map<K1, V> guavaJava8Version(Map<K1, K2> first, Map<K2, V> second) { 
    return Maps.transformValues(
    Maps.filterKeys(first, Predicates.in(second.keySet())), 
    second::get); 
} 

か:あなたはマップに変更が反映されます怠惰なビューをしたい場合は、Guavaを使用して、このような何かを

public static <K1, K2, V> Map<K1, V> guavaJava8Version(Map<K1, K2> first, Map<K2, V> second) { 
    return transformValues(filterKeys(first, in(second.keySet())), second::get); 
} 

これによって返されるマップはよく実行する必要がありますルックアップとイテレーションに十分です(両方ともハッシュベースの場合は一定の時間)が、size()(またはそれが返すコレクション)にはコールしないでください。

+0

固体のstuff..thanks! – labheshr

+0

詳細:なぜ2番目のマップにない要素をフィルタリングしますか? 2番目のマップから返されたヌル値とキーの関連付けを維持できます(フィルタリングは意味をなさけるかもしれませんが、質問では質問されませんでした)。 – Thierry

+0

@Thierry null値は好きではありません。しかし、確かに、それらを持っている場合は、フィルタを使って行を削除してください –

関連する問題