Java以特定顺序从多个映射的值构建列表
假设您有一个按有意义顺序排列的整数列表(列表1) 您还有两个映射,其中整数键是List1的子集。两个映射之间没有重叠,但在它们之间,List1可能是它们两个键集集合的适当超集(即,List1中的某些整数在两个映射中都丢失) 如何从两个映射中构建新的对象列表,在这两个映射中,对象按其整数键在列表1中的显示顺序显示Java以特定顺序从多个映射的值构建列表,java,algorithm,Java,Algorithm,假设您有一个按有意义顺序排列的整数列表(列表1) 您还有两个映射,其中整数键是List1的子集。两个映射之间没有重叠,但在它们之间,List1可能是它们两个键集集合的适当超集(即,List1中的某些整数在两个映射中都丢失) 如何从两个映射中构建新的对象列表,在这两个映射中,对象按其整数键在列表1中的显示顺序显示 为对象创建一个列表 循环浏览列表并检入对象的两个贴图 哪个地图有匹配项,请将该对象添加到新列表中 为对象创建一个列表 循环浏览列表并检入对象的两个贴图 哪个地图有匹配项,请将该对象添加到
您只需使用一个循环即可完成此操作:
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));
}
上面的代码已简化,但您应该了解其基本思想。您只需使用一个循环即可完成此操作:
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));
}
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);
上面的代码被简化了,但您应该了解了大概的意思。List l=new ArrayList();
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);
for(整数i:list1)
MyObj o=(map1.containsKey(i))?map1.get(i):map2.get(i);
如果(o!=null)
l、 添加(o);
用containsKey更新,看起来很新奇。
List l=new ArrayList();
for(整数i:list1)
MyObj o=(map1.containsKey(i))?map1.get(i):map2.get(i);
如果(o!=null)
l、 添加(o);
用containsKey更新,看起来很新奇。使用: 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 SortedMap=新树映射();
//添加第一个映射的条目
分类地图putAll(地图1);
//添加第二个映射的条目
//(所有条目现在按键排序)
分类地图putAll(地图2);
//现在删除列表1中没有的所有条目
sortedMap.keySet().retainAll(列表1);
//这是您的值列表,按键排序
List arrayList=新的arrayList(sortedMap.values());
参考:
:返回一个集合
此文件中包含的密钥的视图
地图。集合的迭代器返回
按升序排列的键。布景是
以地图为后盾,因此对
映射反映在集合中,和
反之亦然。[…]该集合支持
元素移除,它移除
从地图上对应映射,
通过[…]保留,然后清除
行动
:仅保留
此集合中的元素是
包含在指定的集合中
(可选操作)。换句话说,,
从此集合中删除其所有属性
中不包含的元素
指定的集合
:返回集合的视图
此映射中包含的值。这个
集合的迭代器返回
值按
相应的键。藏品是
以地图为后盾,因此对
地图反映在收藏中,
反之亦然
使用:
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 SortedMap=新树映射();
//添加第一个映射的条目
分类地图putAll(地图1);
//添加第二个映射的条目
//(所有条目现在按键排序)
分类地图putAll(地图2);
//现在删除列表1中没有的所有条目
sortedMap.keySet().retainAll(列表1);
//这是您的值列表,按键排序
List arrayList=新的arrayList(sortedMap.values());
参考:
:返回一个集合
此文件中包含的密钥的视图
地图。集合的迭代器返回
按升序排列的键。布景是
以地图为后盾,因此对
映射反映在集合中,和
反之亦然。[…]该集合支持
元素移除,它移除
从地图上对应映射,
通过[…]保留,然后清除
行动
:仅保留
此集合中的元素是
包含在指定的集合中
(可选操作)。换句话说,,
从此集合中删除其所有属性
中不包含的元素
指定的集合
:返回集合的视图
此映射中包含的值。这个
集合的迭代器返回
值按
相应的键。藏品是
以地图为后盾,因此对
地图反映在收藏中,
反之亦然
是否希望list2
包含映射中的键或值?列表1中缺少的元素如何,是否希望它们出现在结果列表中?是否希望list2
包含映射中的键或值?列表1中缺少的元素如何,是否希望它们出现在结果列表中?哦,OP需要值,而不是值keys@Sean是的。我看到了。好的,现在你的解决方案和jzd的差不多了s@Sean是的。我相信事实上是一样的。(但我的有代码)哦,OP需要值,而不是keys@Sean是的。我看到了。好的,现在你的解决方案和jzd的差不多了s@Sean是的。我相信事实上是一样的。(但我的有密码)