の値として1のキーでハッシュマップJavaは、私は2つのマップを持っている他の
for each entry in map1 {
map3.put(entry.getKey(), map2.get(entry.getValue()))
}
理想的には、Java 7に準拠したソリューションに感謝します。が、Java 8との巧妙な1が
おかげ
の値として1のキーでハッシュマップJavaは、私は2つのマップを持っている他の
for each entry in map1 {
map3.put(entry.getKey(), map2.get(entry.getValue()))
}
理想的には、Java 7に準拠したソリューションに感謝します。が、Java 8との巧妙な1が
おかげ
教育目的のために良いでしょう。ここにこれを行いますの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()
(またはそれが返すコレクション)にはコールしないでください。
Streamチュートリアルhttps://docs.oracle.com/javase/tutorial/collections/streams/を参照してください。ストリームAPIを使用してこれらの基本操作を行う方法を教えてください。 – Tunaki