我有一个包含数字列表的arraylist。我想从HashMap中获取所有值,这些值包含数组列表中的键。
例如,数组列表包含1,2,3,4,5,6,7,8,9
列表
我想获取键1,2,3,4,5,6,7,8,9
map
所以目前我正在实施
for (i=0;i<list.size;i++){
map_new.put(list.get(),map.get(list.get()))
}
有没有有效的方法可以做到这一点?
答案 0 :(得分:3)
您的代码基本上假定map.get(list.get())
始终返回一个值,您可以尝试以下代码,该代码首先过滤null
对象中的非list
值,然后添加到新{ {1}}:
Map
如果Map<String, Integer> newMap = list.stream().
filter(key -> (map.get(key) != null)).//filter values not present in Map
collect(Collectors.toMap(t -> t, t -> map.get(t)));//now collect to a new Map
返回map.get(list.get())
,您的代码会在其中创建null
,其中包含Map
值,您最终可能会执行null
检查,这是不好的,而是可以确保新创建的null
始终包含每个密钥的值。
答案 1 :(得分:0)
假设列表和地图的签名如下
List<Integer> list;
Map<Integer, Integer> map;
您可以使用以下
for(int a : list){
Integer b = map.get(a);
if(b != null)
// b is your desired value you can store in another collection
}
这与您已使用的程序类似。
您可以在O(1)
中访问地图,因此此代码的复杂性为O(listsize)
答案 2 :(得分:0)
你的效率并不高。考虑到上面给出的代码示例,您还可以做几件小事:
1)将for循环更改为
for(Long num : list)
而不是使用索引进行迭代,这将减少您通过列表进行调用。
2)您可以更新现有地图,这样您甚至不需要迭代。
map.keySet().retainAll(list);
for(Long key: map.keySet()) {
System.out.println(map.get(key));
}
使用此现有映射将仅包含其键存在于列表中的那些数据,但您应该根据其余的代码逻辑仔细使用它。
答案 3 :(得分:0)
您可以利用地图的键集由地图本身支持这一事实,并且对键集的修改将反映回地图本身。这样,您可以使用retainAll()
接口的Set
方法通过一行代码缩小地图。这是一个例子:
final Map<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "A");
m.put(2, "B");
m.put(3, "C");
m.put(4, "D");
m.put(5, "E");
final List<Integer> al = Arrays.asList(new Integer[] { 2, 4, 5 });
System.out.println(m);
m.keySet().retainAll(al);
System.out.println(m);
这将输出:
{1=A, 2=B, 3=C, 4=D, 5=E}
{2=B, 4=D, 5=E}