2012-07-18 54 views
0

我有两个映射与键作为整数和价值作为双。迭代两个映射到第三个映射关键字从这两个映射

我想要创建一个按键和值排序的第三张地图,它是来自这两个地图的双打列表。

MAP1:

1, 90.00 
5, 75.45 
8, 76.50 

MAP2:

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方法将所有的键放到第三个映射中。但是,如何按照我的意愿设置价值?

感谢您的阅读!

回答

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

使用番石榴它的那样简单

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

Map<Integer, Collection<Double>> finalMap = finalMultiMap.asMap(); 
+0

问题是针对排序的第三张地图,因为您的finalMap应该是SortedMap的实现,如TreeMap(http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap的.html) – 2012-07-18 06:27:48

0

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

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

它的工作原理一个地图列表,所以解决方案不限于两张地图。