如何在Java中将Map转换为List?


674

将a转换Map<key,value>为a 的最佳方法是List<value>什么?只是遍历所有值并将它们插入列表中,还是我忽略了什么?


1
我认为如果必须将map转换为list并不是一个好的模型。应该以这种情况不会出现的方式编写代码。
错误发生

Answers:


1299
List<Value> list = new ArrayList<Value>(map.values());

假设:

Map<Key,Value> map;

7
谢谢!我是假设从铸造CollectionList会的工作。
ass 2013年

1
我怀疑它不起作用的原因是,由values()返回的集合依赖于基础Map。通过进行复制构造函数调用,您可以分配存储并将值复制到该存储中,从而断开连接……
Sheldon R.

4
如果我们有LinkedHashMap-订单会保持不变吗?

1
@ user2022068是的,应使用LinkedHashMap保留订单。
SusanW

1
@SheldonR。是的-由keySet()和返回的集合values()通常是填充对象,它们给出基础结构的Set或Collection视图(keySet()返回Set以强调不重复)。对于values(),返回的对象可能List,但通常不是。如您所说,创建一个真实的列表会断开链接,这意味着您不再依赖原始地图。但是有时,您只需要一个列表,因为某些API需要一个列表-加强了一个好的API应该只需要它可以摆脱的最抽象的接口的规则……
SusanW

137

这里的问题是Map有两个值(一个键和一个值),而List只有一个值(一个元素)。

因此,最好的办法是获取List键或值中的一个。(除非我们进行包装以保留键/值对)。

说我们有一个Map

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

List可以通过ArrayList从方法Set返回的值中创建一个新键来获取键Map.keySet

List<String> list = new ArrayList<String>(m.keySet());

而作为该值List能够获得创建新的ArrayListCollection由返回的Map.values方法:

List<String> list = new ArrayList<String>(m.values());

获取List密钥的结果:

苹果
另一个
你好

获取List值的结果:

3.14
元件
世界

3
应当注意,这些方法返回的值的顺序未定义,对于HashMap类似的未排序Map实现,它实际上是随机的。
约阿希姆·绍尔

1
是的,您必须知道它是LinkedHashMap或类似的东西。原始问题的问题在于该问题被遗漏了,即需要编辑。问题不在于将Map转换为List,而是如何将Map的值作为List获取。方法值给您一个Collection,但没有列表,因此需要一个巧妙的小技巧。
demongolem

我认为您可以在答案中添加@ M0les的内容:您需要以某种方式“通过” SortedMap。从具体的SortedMap实现开始(例如TreeMap),或者将输入地图插入SortedMap,然后再将其转换为List
Ignacio Rubio 2014年

41

使用Java 8 Streams API。

List<Value> values = map.values().stream().collect(Collectors.toList());

8
我更喜欢接受的基于构造函数的答案。流应用于简化代码。
亚伦

1
@Aaron是的,对于从Map获取值列表的任务,构造函数似乎更简单。但是,如果您在代码库中广泛使用Streams,则最好保持一致。
Matej Kormuth

1
当我使用此方法时,如果我正在获取大量数据,则会出错。.thread在java.util.stream.ReduceOps $ 3.makeSink(Unknown Source)上循环。如果线程无限循环,CPU消耗将开始增加。循环线程的堆栈跟踪如下,检查它
加尼甚吉里

24

map.entrySet()给您一个Map.Entry包含键和值的对象的集合。然后,您可以将其转换为所需的任何集合对象,例如new ArrayList(map.entrySet())


23

什么清单?

假设map您是Map

  • map.values()将返回Collection包含所有地图值的。
  • map.keySet()将返回Set包含所有地图键的。

14

我猜您想将包含的值转换Maplist?最简单的是调用接口的values()方法Map。这将返回中包含Collection的value对象Map

请注意,这Collection是由Map对象支持的,对对象的任何更改Map都将在此处反映出来。因此,如果您想要一个单独的副本不绑定到您的Map对象,只需创建一个新的List对象,如ArrayList传递值Collection,如下所示。

ArrayList<String> list = new ArrayList<String>(map.values());

6

你可以这样

List<Value> list = new ArrayList<Value>(map.values());

1
OP询问有关如何转换为List <value>的问题。提供答案时,最好在提议的解决方案中包括良好说明。这个问题已经被接受回答。
HaveNoDisplayName 2014年

5

如果要确保结果中的值在List<Value>输入的键顺序中,则Map<Key, Value>需要以SortedMap某种方式“通过” 。

要么具体的SortedMap实现开始(例如TreeMap),要么在将输入Map转换为SortedMap之前将其插入到中List。例如:

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

否则,您将获得Map实现所提供的任何本机排序,通常可以是自然键排序以外的其他内容(尝试HashtableConcurrentHashMap,品种)。


5
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("java", 20);
    map.put("C++", 45);

    Set <Entry<String, Integer>> set = map.entrySet();

    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);

我们可以在列表中同时拥有键和值对。也可以通过遍历列表使用Map.Entry获取键和值。


4
// you can use this
List<Value> list = new ArrayList<Value>(map.values());

// or you may use 
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());    
}

1
"Map<String , String > map = new HapshMap<String , String>;
 map.add("one","java");
 map.add("two" ,"spring");
 Set<Entry<String,String>> set =  map.entrySet();
 List<Entry<String , String>> list = new ArrayList<Entry<String , String>>    (set);
 for(Entry<String , String> entry : list ) {
   System.out.println(entry.getKey());
   System.out.println(entry.getValue());
 } "

1

这是从地图获取值的通用方法。

public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
    List<T> thingList = new ArrayList<>();

    for (Map.Entry<String, T> entry : map.entrySet()) {
        thingList.add(entry.getValue());
    }

    return thingList;
}

1
HashMap<Integer, List<String>> map = new HashMap<>(); 
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
    return new ArrayList<String>((Collection<? extends String>) map.values());
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.