在地图中查找匹配键和值

时间:2014-06-29 07:27:14

标签: java map iterator set

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

提示:

编写一个方法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}

在前面的地图上调用您的方法将返回以下新地图(键/值对的顺序无关紧要):

{Logan=62, Stefanie=80, Jeff=88, Kim=52}

我的代码:

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

2 个答案:

答案 0 :(得分:2)

您将所有值从第一个输出到输出,方法是将其传递给构造函数。

Map<String, Integer> output = new HashMap<String, Integer>(first); // you are passing first to the constructor.

您不需要创建另一个Set,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
}

这是正确的实施方案。

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

答案 1 :(得分:0)

本练习的简单解决方案是跳过迭代器并使用for循环,如下所示。对于map1中的每个名称,我们检查它是否存在于map2中,以及值是否匹配。然后将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;        
}