如何有效地搜索返回arraylist中的键的所有值

时间:2017-04-12 06:37:45

标签: java arraylist hashmap

我有一个包含数字列表的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()))
}

有没有有效的方法可以做到这一点?

4 个答案:

答案 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}
相关问题