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

Posted

技术标签:

【中文标题】如何在 Java 中将 HashMap 转换为 List?【英文标题】:How does one convert a HashMap to a List in Java? 【发布时间】:2011-07-25 21:29:51 【问题描述】:

在 Java 中,如何将 HashMap 的值返回为 List

【问题讨论】:

这可能不应该是一个问题——或者你应该把它变成一个适当的问题并接受出现的第一个合理的答案?这使得找到需要回答的真正问题变得更加困难。 如果返回列表的要求不是必须的,我认为将CollectionSet 转换为ArrayList 对我来说没有多大意义。只需返回您从 HashMap 获得的集合或 Set 重复:***.com/questions/1026723/… 【参考方案1】:
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
List<String> list = new ArrayList<String>(map.values());
for (String s : list) 
    System.out.println(s);

【讨论】:

基本上,HashMap 类的 .values() 方法返回值的集合。你也可以使用 .keys() 来解决这个问题。 ArrayList() 类接受一个 Collection 作为其构造函数之一。因此,您从 HashMap 值的集合创建一个新的 ArrayList。我不知道性能如何,但对我来说,简单是值得的! 如果您只想打印或获取对象 - 您不需要使用 List。 只是把它放在那里澄清。【参考方案2】:

假设你有:

HashMap<Key, Value> map; // Assigned or populated somehow.

对于值列表:

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

对于键列表:

List<Key> keys = new ArrayList<Key>(map.keySet());

请注意,使用 HashMap 时键和值的顺序将不可靠;如果您需要在各自的列表中保留键和值位置的一对一对应关系,请使用 LinkedHashMap。

【讨论】:

+1 表示正确排序应使用LinkedHashMap List。此外,对于无序转换,最好使用 HashMap Set 来表示它是无序的。 由于其简单性,这似乎是比所选答案更好的解决方案。【参考方案3】:

基本上你不应该把问题和答案混为一谈,因为它会让人困惑。

然后您可以指定转换的含义并选择其中一个解决方案

List<Integer> keyList = Collections.list(Collections.enumeration(map.keySet()));

List<String> valueList = Collections.list(Collections.enumeration(map.values()));

【讨论】:

一个Map 有一个keySet() 方法。使用它比您为 keyList 发布的内容更简单。 @Joachim,这是我感谢的正确方法名称。但是,如果您想将 Set 转换为列表,则可以这样做。 qVash:为什么?您可以简单地使用new ArrayList(map.keySet()),这是一条更直接的路线,并避免创建Enumeration。而且我几乎可以肯定它会表现得更好,因为ArrayList 从一开始就会以正确的大小创建。 这会返回对原始值的引用,而不是一组新的对象吗? @Mark:最终效果与您发布的内容相同:您将拥有一个新的ArrayList 引用同样被Map 引用的对象。【参考方案4】:

Collection Interface 有 3 个视图

键集 价值观 入口集

其他已回答将 Hashmap 转换为键和值的两个列表。完全正确

我的补充:如何将“键值对”(又名entrySet)转换成列表。

      Map m=new HashMap();
          m.put(3, "dev2");
          m.put(4, "dev3");

      List<Entry> entryList = new ArrayList<Entry>(m.entrySet());

      for (Entry s : entryList) 
        System.out.println(s);
      

ArrayList 有这个构造函数。

【讨论】:

【参考方案5】:

使用 Java 8 和 Stream Api 的解决方案:

private static <K, V>  List<V> createListFromMapEntries (Map<K, V> map)
        return map.values().stream().collect(Collectors.toList());
    

用法:

  public static void main (String[] args)
    
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");

        List<String> result = createListFromMapEntries(map);
        result.forEach(System.out :: println);
    

【讨论】:

【参考方案6】:

如果您只希望它遍历您的 HashMap,则不需要列表:

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values()) 
    System.out.println(s);

当然,如果您想在迭代时从结构上修改映射(即不仅仅是更改现有键的值),那么您最好使用“复制到 ArrayList”方法,否则您将收到 ConcurrentModificationException .或者导出为数组:

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values().toArray(new String[])) 
    System.out.println(s);

【讨论】:

【参考方案7】:

如果您想在列表中保持相同的顺序,请说: 您的地图如下所示:

map.put(1, "msg1")
map.put(2, "msg2")
map.put(3, "msg3")

你希望你的列表看起来像

["msg1", "msg2", "msg3"]   // same order as the map

您将不得不遍历地图:

// sort your map based on key, otherwise you will get IndexOutofBoundException
Map<String, String> treeMap = new TreeMap<String, String>(map)

List<String> list = new List<String>();
for (treeMap.Entry<Integer, String> entry : treeMap.entrySet()) 
    list.add(entry.getKey(), entry.getValue());
  

【讨论】:

以上是关于如何在 Java 中将 HashMap 转换为 List?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中将十六进制字符串转换为long?

如何在matlab中将L*a*b*转换为灰度

在 Java 中将 long 转换为字节

如何在Dart中将列表转换为地图

在JS中将对象数组减少为hashmap

如何在 JSP/Java 中创建多维 HashMap 或 Hashtable 并将其转换为 JSON 对象?