假设您有一个有意义顺序的整数列表(List1)。
您还有两个Map,其中Integer键是List1的子集。两个映射之间没有重叠,但在它们之间,List1可能是它们的两个密钥集的集合的正确超集(即,两个映射中缺少List1中的一些整数)。
如何从两个地图构建一个新的对象列表,其中对象按其整数键出现在List1中的顺序出现?
答案 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)
答案 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的迭代器返回 值按升序排列 相应的键。这个系列是 由地图支持,所以改变了 地图反映在集合中, 反之亦然。