Java构建按特定顺序从多个地图的值列出

时间:2011-01-25 15:24:02

标签: java algorithm

假设您有一个有意义顺序的整数列表(List1)。

您还有两个Map,其中Integer键是List1的子集。两个映射之间没有重叠,但在它们之间,List1可能是它们的两个密钥集的集合的正确超集(即,两个映射中缺少List1中的一些整数)。

如何从两个地图构建一个新的对象列表,其中对象按其整数键出现在List1中的顺序出现?

4 个答案:

答案 0 :(得分:2)

你可以通过循环相当简单地完成这项工作:

Map map1;
Map map2;
List list2;
// iterate through all of the possible keys in order
for(Object possibleKey: List1) {
    // If the possible ke is a key in one of the maps,
    // add it to your new list.  This will preserve order.
    if(map1.containsKey(possibleKey))
        list2.add(map1.get(possibleKey));
    else if (map2.containsKey(possibleKey))
        list2.add(map2.get(possibleKey));
}

上面的代码已经过简化,但你应该得到一般的想法。

答案 1 :(得分:1)

  1. 为对象创建一个列表。
  2. 循环浏览列表并检查两个映射中的对象。
  3. 哪个地图有匹配项将该对象添加到新列表中。

答案 2 :(得分:1)

List<MyObj> l = new ArrayList<MyObj>();
for(Integer i: list1)
   MyObj o = (map1.containsKey(i))?map1.get(i):map2.get(i);
   if(o!=null)
     l.add(o);

使用containsKey更新,似乎很花哨。

答案 3 :(得分:0)

使用SortedMap

SortedMap的好处是它的所有集合视图都是a)已排序和 b)由地图支持,这使得很容易将地图值限制为列表中的值并以正确的顺序检索值:

// create a SortedMap
SortedMap<Integer,Object> sortedMap = new TreeMap<Integer, Object>();
// add the entries of the first map
sortedMap.putAll(map1);
// add the entries of the second map
// (all entries are now sorted by key)
sortedMap.putAll(map2);
// now remove all entries that are not in List1
sortedMap.keySet().retainAll(list1);
// and here's your list of the values, sorted by key
List<Object> arrayList = new ArrayList<Object>(sortedMap.values());

参考:

  

SortedMap.keySet():返回一个Set   查看包含在此中的键   地图。 set的迭代器返回   键按升序排列。这套是   由地图支持,所以改变了   地图反映在集合中,和   反之亦然即可。 [...]集支持   元素删除,删除   来自地图的相应映射,   通过[...] retainAll ,并清除   操作

     

Set.retainAll():只保留   这个集合中的元素是   包含在指定的集合中   (可选操作)。换一种说法,   从此集中移除所有内容   未包含在内的元素   指定的集合

     

SortedMap.values():返回Collection视图   此地图中包含的值。该   collection的迭代器返回   值按升序排列   相应的键。这个系列是   由地图支持,所以改变了   地图反映在集合中,   反之亦然。