Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个键作为另一个值的Java哈希映射_Java_Hashmap - Fatal编程技术网

一个键作为另一个值的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值。但是,如果您想拥有它们,请删除带有过滤器的行