【问题标题】:How can I compare two maps of different size如何比较两张不同大小的地图
【发布时间】:2016-11-08 16:24:19
【问题描述】:

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

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 的 d 的值

到目前为止我的代码。

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

【问题讨论】:

  • 您是否知道Maps 有一个lookup function 来获取值,如果存在映射,则无需遍历整个映射?
  • 你为什么不用get?这段代码有点难以理解,qvec 是什么?
  • 哦不,我不熟悉这些东西,如何使用或者那个查找功能是什么?
  • 哦,Qvec和dvec是两个列表
  • 否 :( 我想将 qm3 ( d, e) 的每个键匹配到 m (e, c ,d ) 的每个键。例如 ,d 将与 e, c, d 进行比较. 如果找到匹配项,我会将 d 的值放在两个列表中。qvec 将存储 qm3 中 d 的值,dvec 将存储 m 中 d 的值

标签: java java-8


【解决方案1】:
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);
    }   
}

【讨论】:

  • 您应该考虑使用m.containsKey(key_from_qm3) 而不是m.keySet().contains(key_from_qm3)
【解决方案2】:

据了解,您的任务可以通过以下方式完成:

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 必须需要强调的是HashMaps 没有定义的顺序。因此,仅填充循环内的两个列表可确保结果位置与相同的键相关联。尽管如此,它是完全未定义的,哪个键与哪个位置相关联。

此外,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 的默认值。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多