Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何高效地搜索并返回arraylist中键的所有值_Java_Arraylist_Hashmap - Fatal编程技术网

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

Java 如何高效地搜索并返回arraylist中键的所有值,java,arraylist,hashmap,Java,Arraylist,Hashmap,我有一个数组列表,其中包含一个数字列表。我想从HashMap中获取所有值,HashMap包含数组列表中的键 例如,假设数组列表包含1,2,3,4,5,6,7,8,9列表 我想得到键1,2,3,4,5,6,7,8,9映射的所有值 所以目前我正在实施 for (i=0;i<list.size;i++){ map_new.put(list.get(),map.get(list.get())) } 有什么有效的方法可以做到这一点吗?假设列表和地图的签名如下 List<

我有一个数组列表,其中包含一个数字列表。我想从HashMap中获取所有值,HashMap包含数组列表中的键

例如,假设数组列表包含1,2,3,4,5,6,7,8,9列表

我想得到键1,2,3,4,5,6,7,8,9映射的所有值

所以目前我正在实施

for (i=0;i<list.size;i++){

           map_new.put(list.get(),map.get(list.get()))
}

有什么有效的方法可以做到这一点吗?

假设列表和地图的签名如下

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
}
这与您已经使用的步骤类似


由于您可以在O1中访问映射,因此假设列表和映射的签名如下所示,此代码的复杂性将为Olistsize

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
}
这与您已经使用的步骤类似


由于您可以在O1中访问映射,因此此代码的复杂性将是Olistsize

您的代码基本上假定map.getlist.get始终返回一个值,因此您可以尝试以下代码,该代码首先从列表对象中筛选非空值,然后添加到新映射:


在这种情况下,如果map.getlist.get返回null,则代码将创建一个包含null值的映射,您可能会对其执行null检查,这是不好的,相反,您可以确保新创建的映射始终包含每个键的值。

您的代码基本上假定map.getlist.get始终返回一个值,您可以尝试以下代码,该代码首先从列表对象中筛选NOTNULL值,然后添加到新映射中:


在这种情况下,如果map.getlist.get返回null,那么您的代码将创建一个包含null值的映射,您可能最终会对其执行null检查,这是不好的,相反,您可以确保新创建的映射始终包含每个键的值。

为了提高效率,您可以做的事情不多。考虑到上面给出的代码示例,仍然可以做一些小事情:

1将for循环更改为

for(Long num : list)
这将减少对列表的调用,而不是使用索引进行迭代

2您可以更新现有地图,这样您甚至不需要迭代

map.keySet().retainAll(list);
for(Long key: map.keySet()) {
    System.out.println(map.get(key));
}

使用此现有映射,将只包含其键在列表中的数据,但您应该根据其余代码逻辑小心使用它。

为了提高效率,您所能做的不多。考虑到上面给出的代码示例,仍然可以做一些小事情:

1将for循环更改为

for(Long num : list)
这将减少对列表的调用,而不是使用索引进行迭代

2您可以更新现有地图,这样您甚至不需要迭代

map.keySet().retainAll(list);
for(Long key: map.keySet()) {
    System.out.println(map.get(key));
}

使用此现有映射时,将只包含键在列表中的数据,但您应根据其余代码逻辑小心使用它。

您可以利用映射的键集由映射本身支持的事实,对键集的修改将反映回映射本身。通过这种方式,您可以使用Set接口的retainal方法,用一行代码减少映射。以下是一个例子:

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);

可以利用映射的键集由映射本身支持这一事实,对键集的修改将反映回映射本身。通过这种方式,您可以使用Set接口的retainal方法,用一行代码减少映射。以下是一个例子:

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);

这段代码运行吗?你在这里调用的是谁的put方法?所以你通常想要一个映射,其中包含列表中的键和映射中的值,而映射中也包含相同的键?如果我理解你的意图,你真的无法获得更高的效率。您可以使用for elementtypee:list来代替带有索引的for循环,这除了更具可读性之外,还可能更快一点。不过,如果你发布的代码确实可以编译,这会有所帮助。假设上面的代码可以编译,这种方法是不错的。在效率参数上,任何其他方法都将执行类似的操作。在您的代码中,如果map.get不返回值,该怎么办?该代码是否运行?你在这里调用的是谁的put方法?所以你通常想要一个映射,其中包含列表中的键和映射中的值,而映射中也包含相同的键?如果我理解你的意图,你真的无法获得更高的效率。您可以使用for elementtypee:list来代替带有索引的for循环,这除了更具可读性之外,还可能更快一点。不过,如果你发布的代码确实可以编译,这会有所帮助。假设上面的代码可以编译,这种方法是不错的。在效率参数上,任何其他方法都将执行类似的操作。在您的代码中,如果map.get不返回值怎么办?