Java 在映射中查找匹配的键和值

Java 在映射中查找匹配的键和值,java,map,iterator,set,Java,Map,Iterator,Set,在这个问题中,我必须在两个映射中找到所有匹配的键/值映射,然后将其返回到一个新映射中,但我遇到了一些问题。我的想法是从两个映射中找到所有匹配的键,然后使用这些键将其引用到值。如果值匹配,我会将键/值放入映射中。我试图找出为什么它只是添加了所有相同的键;它仅在其相应的值也匹配时添加这些键。谢谢 提示: 编写一个intersect方法,该方法将字符串到整数的两个映射作为参数,并返回一个新映射,其内容是这两个映射的交集。此处将两个贴图的交点定义为两个贴图中存在的键和值集。因此,如果某些键K在第一个和第

在这个问题中,我必须在两个映射中找到所有匹配的键/值映射,然后将其返回到一个新映射中,但我遇到了一些问题。我的想法是从两个映射中找到所有匹配的键,然后使用这些键将其引用到值。如果值匹配,我会将键/值放入映射中。我试图找出为什么它只是添加了所有相同的键;它仅在其相应的值也匹配时添加这些键。谢谢

提示:

编写一个intersect方法,该方法将字符串到整数的两个映射作为参数,并返回一个新映射,其内容是这两个映射的交集。此处将两个贴图的交点定义为两个贴图中存在的键和值集。因此,如果某些键K在第一个和第二个映射中都映射到值V,则将其包含在结果中。如果K在两个映射中不作为键存在,或者如果K在两个映射中不映射到相同的值V,则将该对从结果中排除。例如,考虑下面两个映射:

{Janet=87, Logan=62, Whitaker=46, Alyssa=100, Stefanie=80, Jeff=88, Kim=52, Sylvia=95}
{Logan=62, Kim=52, Whitaker=52, Jeff=88, Stefanie=80, Brian=60, Lisa=83, Sylvia=87}
对前面的映射调用方法将返回以下新映射(键/值对的顺序无关紧要):

我的代码:

// we need to store the keys, then get the values in common, then put the key/map into map
public static Map<String, Integer> intersect(Map<String, Integer> first, Map<String, Integer> second) {
    Map<String, Integer> output = new HashMap<String, Integer>(first); // combined output
    Set<String> keyFirst = new HashSet<String>(); // stores all the keys for first
    for (String key: first.keySet()) { // goes through each key in input
        keyFirst.add(key); // adds all keys from first into keyFirst
    }

    // goes through each key in common and checks to see if they reference to the same value
    Iterator<String> keyFirstItr = keyFirst.iterator();
    while (keyFirstItr.hasNext()) {
        String keyTemp = keyFirstItr.next();
        if (first.get(keyTemp) == second.get(keyTemp)) { // If same key, same value mapped
            output.put(keyTemp, first.get(keyTemp)); // add key value to map
        }
    }
    return output;
}
//我们需要存储键,然后获取公共值,然后将键/映射放入映射中
公共静态地图相交(地图第一,地图第二){
映射输出=新HashMap(第一个);//组合输出
Set keyFirst=new HashSet();//存储第一个的所有键
for(String key:first.keySet()){//遍历输入中的每个键
key first.add(key);//将所有键从first添加到keyFirst中
}
//遍历每个公用键并检查它们是否引用相同的值
迭代器keyFirstItr=keyFirst.Iterator();
while(keyFirstItr.hasNext()){
字符串keyTemp=keyFirstItr.next();
if(first.get(keyTemp)==second.get(keyTemp)){//if相同的键,映射相同的值
output.put(keyTemp,first.get(keyTemp));//将键值添加到映射
}
}
返回输出;
}

通过将值传递给构造函数,将所有值从第一个放到输出

Map<String, Integer> output = new HashMap<String, Integer>(first); // you are passing first to the constructor.
Map输出=新HashMap(第一个);//您将首先传递给构造函数。
您不需要创建另一个集合,keySet()方法返回Set,因此下面的行不是必需的

Set<String> keyFirst = new HashSet<String>(); // stores all the keys for first
    for (String key: first.keySet()) { // goes through each key in input
        keyFirst.add(key); // adds all keys from first into keyFirst
}
Set keyFirst=new HashSet();//存储第一个的所有密钥
for(String key:first.keySet()){//遍历输入中的每个键
key first.add(key);//将所有键从first添加到keyFirst中
}
这是正确的解释

// we need to store the keys, then get the values in common, then put the key/map into map
public static Map<String, Integer> intersect(Map<String, Integer> first, Map<String, Integer> second) {
    Map<String, Integer> output = new HashMap<String, Integer>(); // combined output

    // goes through each key in common and checks to see if they reference to the same value    
    Iterator<String> keyFirstItr = first.keySet().iterator();
    while (keyFirstItr.hasNext()) {
        String keyTemp = keyFirstItr.next();
        if (first.get(keyTemp).equals(second.get(keyTemp))) { // If same key, same value mapped
            output.put(keyTemp, first.get(keyTemp)); // add key value to map
        }
    }
    return output;
}
//我们需要存储键,然后获取公共值,然后将键/映射放入映射中
公共静态地图相交(地图第一,地图第二){
映射输出=新HashMap();//组合输出
//遍历每个公用键并检查它们是否引用相同的值
迭代器keyFirstItr=first.keySet().Iterator();
while(keyFirstItr.hasNext()){
字符串keyTemp=keyFirstItr.next();
if(first.get(keyTemp).equals(second.get(keyTemp)){//if相同的键,映射相同的值
output.put(keyTemp,first.get(keyTemp));//将键值添加到映射
}
}
返回输出;
}

此练习更简单的解决方案是跳过迭代器并使用for循环,如下所示。对于map1中的每个名称,我们检查它是否存在于map2中,以及值是否匹配。然后将K、K和V添加到新地图:

public static Map intersect(Map<String, Integer> map1, Map<String, Integer> map2){
    Map<String, Integer> newMap = new HashMap<>();
    for (String name : map1.keySet()){
        if(map2.containsKey(name) && map1.get(name).equals(map2.get(name))){
            newMap.put(name, map1.get(name));
        }
    }
    return newMap;        
}
公共静态地图相交(地图1、地图2){
Map newMap=newhashmap();
for(字符串名称:map1.keySet()){
if(map2.containsKey(name)和&map1.get(name).equals(map2.get(name))){
newMap.put(name,map1.get(name));
}
}
返回newMap;
}

你的问题是什么?为什么要将对象与
==
进行比较?我试图找出为什么它只添加所有共同的键。这不是问题。这是一种肯定。一个问题以问号结尾。告诉他也使用
equals
,不要使用
=
!get返回的值为整数,因此==willwork@AmitChotaliya:不,不会测试两个引用是否指向同一对象
new Integer(1)==new Integer(1)
为false。@请参见“技巧”&如果您是对的,我将更改答案。它不应该在这里自动装箱/拆箱吗?谢谢你的帮助。我读过的那本书说,拆箱是自动的,“Java理解in和Integer之间的关系,它将为您打开Integer对象,并为您提供存储在其中的int值。”给出的示例是:int product=list.get(0)*list.get(1);
public static Map intersect(Map<String, Integer> map1, Map<String, Integer> map2){
    Map<String, Integer> newMap = new HashMap<>();
    for (String name : map1.keySet()){
        if(map2.containsKey(name) && map1.get(name).equals(map2.get(name))){
            newMap.put(name, map1.get(name));
        }
    }
    return newMap;        
}