gpt4 book ai didi

Java HashMap ,其中一个的键作为另一个的值

转载 作者:行者123 更新时间:2023-12-01 21:30:05 25 4
gpt4 key购买 nike

我有两张 map :

map1 = <K , V>
map2 = <V, someObject>

是否有一种“优雅”的方式输出结果:

map3 = <K, someObject>

一个明显的方法是迭代map1并执行以下操作:

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

理想情况下,我希望能够提供符合 Java 7 的解决方案;但是使用 Java 8 的聪明的将有助于教育目的

谢谢

最佳答案

下面是执行此操作的 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 版本,因为它更容易理解并且对其成本更诚实。

如果您想保留第一个 map 中的 key ,即使它们不存在于第二个 map 中(或可以选择),请使用以下版本:

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;
}

但我个人建议不要这样做。空是邪恶的。

以上所有内容都使用急切求值。如果您想要一个反射(reflect) map 更改的惰性 View ,请使用 Guava并做这样的事情:

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);
}

或者,使用静态导入:

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() (或任何它返回的集合)。

关于Java HashMap ,其中一个的键作为另一个的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37530162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com