如何比较两个不同大小的地图

时间:2016-11-08 16:24:20

标签: java java-8

我有两张不同大小的地图。例如

Map<String, Double> qm3 = new HashMap<>();
Map<String, Double> m = new HashMap<>();

qm3具有以下地图{d=0.2, e=0.3}

m有以下地图{e=0.3, c=0.4, d=0.5}

现在,我想比较这两张地图的按键。如果“qm3”的第一个键与“m”的任何键匹配,那么我想将qm3的值存储在列表 qvec 中,并将m的值存储在另一个列表中 dvec 即可。等等

我想将qm3(d,e)的每个键与m(e,c,d)的每个键匹配。 例如,d将与e,c,d进行比较。 如果找到匹配,那么我将把d的值放在两个列表中。

qvec将存储来自qm3的d的值 和dvec将存储m的值

到目前为止我的代码。

for(Map.Entry<String, Double> qe : qm3.entrySet()){
    for(Map.Entry<String, Double> de : m3.entrySet()){
        System.out.println(qe.getKey());
        if(qe.getKey().equals(de.getKey())){
            //System.out.println(qe.getKey());
            qvec.add(qe.getValue());
            dvec.add(de.getValue());
        }
        else {
            qvec.add(qe.getValue());
            dvec.add(0.0);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class NewClass2 {

    public static void main(String[] args) {
        Map<String, Double> qm3 = new HashMap<>();
        qm3.put("d", 0.2);
        qm3.put("e", 0.3);
        qm3.put("a", 0.8);
        Map<String, Double> m = new HashMap<>();
        m.put("e", 0.3);
        m.put("c", 0.4);
        m.put("d", 0.5);
        List<Double> qvec = new ArrayList<>();
        List<Double> dvec = new ArrayList<>();

        for(String key_from_qm3 : qm3.keySet()){    //for each key from qm3
            if(m.keySet().contains(key_from_qm3)){  //check if it exists in the keyset of m
                qvec.add(qm3.get(key_from_qm3));    //if yes put the value from qm3 into qvec. //map.get(key) returns the value for that key
                dvec.add(m.get(key_from_qm3));      // and the value from m into dvec
            }
        }

        System.out.println("qvec : " + qvec);
        System.out.println("dvec : " + dvec);
    }   
}

答案 1 :(得分:0)

根据可以理解,您的任务可以通过以下方式实现:

for(Map.Entry<String, Double> qe : qm3.entrySet()) {
    qvec.add(qe.getValue());
    dvec.add(m.getOrDefault(qe.getKey(), 0.0));
}

qvec将包含qm3的所有值,类似于qvec.addAll(qm3.values());的结果,dvec将包含与相同键或0.0相关联的值但是,如果没有映射,则必须强调HashMap没有定义的顺序。因此,仅在循环内填充两个列表可确保结果位置与相同的键相关联。尽管如此,它仍然是完全未定义的,哪个关键点与哪个位置有关。

此外,在您的示例中,qm3包含的密钥少于m,因此0.0的后备将永远不会适用。

也许,您想要考虑两个地图的所有键:

LinkedHashSet<String> keys = new LinkedHashSet<>();
keys.addAll(qm3.keySet());
keys.addAll(m.keySet());
for(String key: keys) {
    qvec.add(qm3.getOrDefault(key, 0.0));
    dvec.add(m.getOrDefault(key, 0.0));
}

这将创建一个包含所有键的LinkedHashSet,这将保留它们的插入顺序,因此您也可以稍后使用该集来查找哪个列表位置与哪个键相关联。然后,它将使用0.0默认值填充列表。