一个键作为另一个值的Java哈希映射
我有两张地图:一个键作为另一个值的Java哈希映射,java,hashmap,Java,Hashmap,我有两张地图: map1 = <K , V> map2 = <V, someObject> 理想情况下,我会欣赏符合Java7的解决方案;但是一个使用Java8的聪明的应用程序对于教育目的来说是很好的 谢谢这里有一个Java 8方法可以做到这一点: public static <K1, K2, V> Map<K1, V> java8Version(Map<K1, K2> first, Map<K2, V> second)
map1 = <K , V>
map2 = <V, someObject>
理想情况下,我会欣赏符合Java7的解决方案;但是一个使用Java8的聪明的应用程序对于教育目的来说是很好的
谢谢这里有一个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())));
}
公共静态映射java8Version(映射第一,映射第二){
首先返回。entrySet()
.stream()
.filter(e->second.containsKey(e.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey,e->second.get(e.getValue()));
}
根据需要添加优化和空检查
以下是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;
}
publicstaticmapjava7version(先映射,后映射){
HashMap result=newhashmap(Math.min(first.size(),second.size());
for(Map.Entry:first.entrySet()){
if(second.containsKey(entry.getValue()))
result.put(entry.getKey(),second.get(entry.getValue());
}
返回结果;
}
我想我甚至更喜欢Java7版本,因为它更容易理解,也更诚实地说明了它的成本
如果要保留第一个贴图中的关键点,即使它们在第二个贴图中不存在(或具有选项),请使用以下版本:
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;
}
公共静态映射java8VersionWithNulls(映射第一,映射第二,布尔保留){
首先返回。entrySet()
.stream()
.filter(e->keepNulls | | second.containsKey(e.getValue())
.collect(Collectors.toMap(Map.Entry::getKey,e->second.get(e.getValue()));
}
公共静态映射java7VersionWithNulls(映射第一,映射第二,布尔保留){
HashMap结果=新的HashMap(second.size());
for(Map.Entry:first.entrySet()){
if(keepNulls | | second.containsKey(entry.getValue()))
result.put(entry.getKey(),second.get(entry.getValue());
}
返回结果;
}
但就我个人而言,我会说不要这样做。空是邪恶的
所有这些都使用了急切的评估。如果需要反映贴图更改的惰性视图,请使用并执行以下操作:
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);
}
publicstaticmap-guavaJava8Version(映射第一,映射第二){
返回Maps.transformValue(
Maps.filterKeys(第一个是谓词.in(第二个是.keySet()),
第二:获取);
}
或者,对于静态导入:
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);
}
publicstaticmap-guavaJava8Version(映射第一,映射第二){
返回transformValues(filterKeys(第一个,in(second.keySet())),第二个::get);
}
此方法返回的映射应该能够很好地执行查找和迭代(如果两者都是基于哈希的,则为常数时间),但您可能不应该对其(或它返回的任何集合)调用
size()
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())));
}
公共静态映射java8Version(映射第一,映射第二){
首先返回。entrySet()
.stream()
.filter(e->second.containsKey(e.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey,e->second.get(e.getValue()));
}
根据需要添加优化和空检查
以下是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;
}
publicstaticmapjava7version(先映射,后映射){
HashMap result=newhashmap(Math.min(first.size(),second.size());
for(Map.Entry:first.entrySet()){
if(second.containsKey(entry.getValue()))
result.put(entry.getKey(),second.get(entry.getValue());
}
返回结果;
}
我想我甚至更喜欢Java7版本,因为它更容易理解,也更诚实地说明了它的成本
如果要保留第一个贴图中的关键点,即使它们在第二个贴图中不存在(或具有选项),请使用以下版本:
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;
}
公共静态映射java8VersionWithNulls(映射第一,映射第二,布尔保留){
首先返回。entrySet()
.stream()
.filter(e->keepNulls | | second.containsKey(e.getValue())
.collect(Collectors.toMap(Map.Entry::getKey,e->second.get(e.getValue()));
}
公共静态映射java7VersionWithNulls(映射第一,映射第二,布尔保留){
HashMap结果=新的HashMap(second.size());
for(Map.Entry:first.entrySet()){
if(keepNulls | | second.containsKey(entry.getValue()))
result.put(entry.getKey(),second.get(entry.getValue());
}
返回结果;
}
但就我个人而言,我会说不要这样做。空是邪恶的
所有这些都使用了急切的评估。如果需要反映贴图更改的惰性视图,请使用并执行以下操作:
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);
}
publicstaticmap-guavaJava8Version(映射第一,映射第二){
返回Maps.transformValue(
Maps.filterKeys(第一个是谓词.in(第二个是.keySet()),
第二:获取);
}
或者,对于静态导入:
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);
}
publicstaticmap-guavaJava8Version(映射第一,映射第二){
返回transformValues(filterKeys(第一个,in(second.keySet())),第二个::get);
}
此操作返回的映射应该能够很好地执行查找和迭代(如果两者都是基于哈希的,则为常数时间),但您可能不应该对其(或它返回的任何集合)调用size()
。请阅读流教程,它将教您如何使用流API执行这些基本操作。请阅读流教程,它将教您如何使用流API执行这些基本操作。详细信息:为什么要过滤第二个映射中没有的元素?您可以将密钥与第二个映射返回的null值保持关联(过滤可能有意义,但问题中没有提出)。@Thierry我不喜欢null值。但是当然,如果您想拥有它们,请删除带有filterA细节的行:为什么要过滤第二个贴图中没有的元素?您可以将密钥与第二个映射返回的null值保持关联(过滤可能有意义,但问题中没有提出)。@Thierry我不喜欢null值。但是,如果您想拥有它们,请删除带有过滤器的行