【问题标题】:iterating two maps into a third map on key from both maps将两个映射迭代到两个映射的键上的第三个映射
【发布时间】:2012-07-17 03:06:32
【问题描述】:

我有两个映射,键为整数,值为双精度。

我想创建第三个按键排序的映射,值将是两个映射的双精度列表。

地图1:

1, 90.00
5, 75.45
8, 76.50

地图2:

4, 12.00
5, 322.09
8, 11.09
9, 21.00

最终地图:

1, (90.00,0.00)
5, (75.45,322.09)
8, (76.50,11.09)
9, (0.00, 21.00)

如上所述,如果其中一个映射中的某个键在另一个映射中丢失,则另一个映射的最终映射中的值应默认为 0.00

Map firstMap = new HashMap<Integer, Double>();
Map secondMap = new HashMap<Integer, Double>();

Map finalMap = new HashMap<Integer, List<Double>>();

firstMap.put(1, 90.00);
firstMap.put(5, 75.45);
firstMap.put(8, 76.50);

secondMap.put(4, 12.00);
secondMap.put(5, 322.09);
secondMap.put(8, 11.09);
secondMap.put(9, 21.00);

我可以使用 putAll 方法将所有键放入第三张地图。但是如何根据需要放置值?

感谢阅读!

【问题讨论】:

    标签: java collections map


    【解决方案1】:

    简单地做

    // Create a sorted map
    Map<Integer, List<Double>> finalMap = new TreeMap<Integer, List<Double>>();
    
    Set<Integer> keys = new HashSet<Integer>();
    keys.addAll(firstMap.keySet());
    keys.addAll(secondMap.keySet());
    for (Integer key : keys) {
        double first  = firstMap.containsKey(key)  ? firstMap.get(key)  : 0.0;
        double second = secondMap.containsKey(key) ? secondMap.get(key) : 0.0;
        finalMap.put(key, Arrays.asList(first, second));
    }
    

    使用 Guava 就这么简单

    Multimap<Integer, Double> finalMultiMap = ArrayListMultimap.create();
    finalMultiMap.putAll(Multimaps.forMap(firstMap));
    finalMultiMap.putAll(Multimaps.forMap(secondMap));
    
    Map<Integer, Collection<Double>> finalMap = finalMultiMap.asMap();
    

    【讨论】:

    【解决方案2】:

    以下代码将执行请求的操作

    List<Map<Integer, Double>> originals = getOriginalLists();
    
    Map<Integer, List<Double>> result = new HashMap<Integer, List<Double>>();
    for (Map<Integer, Double> original : originals) {
        for (Map.Entry<Integer, Double> entry : original.entrySet()) {
            if (!result.containsKey(entry.getKey())) {
                result.put(entry.getKey(), new ArrayList<Double>());
            }
            result.get(entry.getKey()).add(entry.getValue());
        }
    }
    

    它适用于一张地图列表,因此解决方案不限于两张地图。

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2020-05-13
      • 1970-01-01
      • 2016-05-13
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2012-04-30
      相关资源
      最近更新 更多