【问题标题】:Java: how to convert HashMap<String, Object> to arrayJava:如何将 HashMap<String, Object> 转换为数组
【发布时间】:2010-11-08 14:24:03
【问题描述】:

我需要将HashMap&lt;String, Object&gt; 转换为数组;谁能告诉我它是怎么做的?

【问题讨论】:

  • 您想要键、值还是两者兼而有之?

标签: java arrays collections hashmap


【解决方案1】:

如果键和值是字符串,并且您希望在同一个数组中交替键和值:

String[] result = myMap.entrySet()
                       .stream()
                       .flatMap(entry -> Stream.of(entry.getKey(),entry.getValue()))
                       .toArray(String[]::new);
// result = {key_1, value_1, key_2, value_2 ...}

【讨论】:

    【解决方案2】:

    如果您需要将值传递给对象数组,请尝试:

    Array:
    Object[] object= hashMap.values().toArray(new Object[0]);
    
    Arraylist:
    ArrayList<Object> object=new ArrayList<>(hashMap.values());
    

    【讨论】:

      【解决方案3】:
      hashMap.keySet().toArray(); // returns an array of keys
      hashMap.values().toArray(); // returns an array of values
      

      编辑

      需要注意的是,两个数组的排序可能不一样, 当需要键/值对时,请参阅 oxbow_lakes 答案以获得更好的迭代方法。

      【讨论】:

      • 实际上,此代码不能保证 hashMap.keySet().toArray()[0] 将是原始 Map 中 hashMap.values().toArray()[0] 的原始键.所以这是非常危险的
      • @CrackerJack9 你能解释一下吗?
      • 两个数组中的键不会对应它们的值。
      • @Jakobud Landon9720 是正确的...顺序是伪随机的,并且不能保证将密钥转换为Set 后 key[0] 将对应于 value[0]以及Collection 的值。虽然它们在技术上被转换为数组(并回答了您的问题),但键值对的概念已经丢失 - 这就是为什么这是一个非常具有误导性(和危险)的答案......
      • 我可以证明这段代码 sn-p 的危险。当我写下它时,我的终端伸出手打了我一巴掌。极其危险!当心!
      【解决方案4】:

      如果你有HashMap&lt;String, SomeObject&gt; hashMap 那么:

      hashMap.values().toArray();
      

      将返回Object[]。如果你想要一个SomeObject 类型的数组,你可以使用:

      hashMap.values().toArray(new SomeObject[0]);
      

      【讨论】:

      • 我认为您的意思是 values() 而不是 keySet() 数组 SomeObject
      • @Alex "在较早的 Java 版本中,建议使用预先确定大小的数组 (...) 但是,由于 OpenJDK 6 的更新较晚,此调用被内化,使得空数组版本的性能相同,并且有时甚至更好, 与预先调整大小的版本相比. 此外, 传递预先调整大小的数组对于并发或同步收集是危险的, 因为在 size 和 toArray 调用之间可能会出现数据竞争, 这可能会导致数组末尾的额外空值, 如果集合在操作期间同时收缩。" - 智能
      【解决方案5】:
      Map<String, String> map = new HashMap<String, String>();
      map.put("key1", "value1");
      map.put("key2", "value2");
      
      Object[][] twoDarray = new Object[map.size()][2];
      
      Object[] keys = map.keySet().toArray();
      Object[] values = map.values().toArray();
      
      for (int row = 0; row < twoDarray.length; row++) {
          twoDarray[row][0] = keys[row];
          twoDarray[row][1] = values[row];
      }
      
      // Print out the new 2D array
      for (int i = 0; i < twoDarray.length; i++) {
          for (int j = 0; j < twoDarray[i].length; j++) {
              System.out.println(twoDarray[i][j]);
          }
      }
      

      【讨论】:

        【解决方案6】:

        如果您使用的是 Java 8+ 并且需要二维 Array,也许对于 TestNG 数据提供者,您可以尝试:

        map.entrySet()
            .stream()
            .map(e -> new Object[]{e.getKey(), e.getValue()})
            .toArray(Object[][]::new);
        

        如果您的Objects 是Strings 并且您需要String[][],请尝试:

        map.entrySet()
            .stream()
            .map(e -> new String[]{e.getKey(), e.getValue().toString()})
            .toArray(String[][]::new);
        

        【讨论】:

          【解决方案7】:
          HashMap<String, String> hashMap = new HashMap<>();
          String[] stringValues= new String[hashMap.values().size()];
          hashMap.values().toArray(stringValues);
          

          【讨论】:

            【解决方案8】:
            @SuppressWarnings("unchecked")
                public static <E,T> E[] hashMapKeysToArray(HashMap<E,T> map)
                {
                    int s;
                    if(map == null || (s = map.size())<1)
                        return null;
            
                    E[] temp;
                    E typeHelper;
                    try
                    {
                        Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
                        Entry<E, T> iK = iterator.next();
                        typeHelper = iK.getKey();
            
                        Object o = Array.newInstance(typeHelper.getClass(), s);
                        temp = (E[]) o;
            
                        int index = 0;
                        for (Map.Entry<E,T> mapEntry : map.entrySet())
                        {
                            temp[index++] = mapEntry.getKey();
                        }
                    }
                    catch (Exception e)
                    {
                        return null;
                    }
                    return temp;
                }
            //--------------------------------------------------------
                @SuppressWarnings("unchecked")
                public static <E,T> T[] hashMapValuesToArray(HashMap<E,T> map)
                {
                    int s;
                    if(map == null || (s = map.size())<1)
                        return null;
            
                    T[] temp;
                    T typeHelper;
                    try
                    {
                        Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
                        Entry<E, T> iK = iterator.next();
                        typeHelper = iK.getValue();
            
                        Object o = Array.newInstance(typeHelper.getClass(), s);
                        temp = (T[]) o;
            
                        int index = 0;
                        for (Map.Entry<E,T> mapEntry : map.entrySet())
                        {
                            temp[index++] = mapEntry.getValue();
                        }
                    }
                    catch (Exception e)
                    {return null;}
            
                    return temp;
                }
            

            【讨论】:

              【解决方案9】:

              我使用的几乎与@kmccoy 相同,但不是keySet() 我这样做了

              hashMap.values().toArray(new MyObject[0]);
              

              【讨论】:

                【解决方案10】:

                进入一维数组。

                    String[] arr1 = new String[hashmap.size()];
                    String[] arr2 = new String[hashmap.size()];
                    Set entries = hashmap.entrySet();
                    Iterator entriesIterator = entries.iterator();
                
                    int i = 0;
                    while(entriesIterator.hasNext()){
                
                        Map.Entry mapping = (Map.Entry) entriesIterator.next();
                
                        arr1[i] = mapping.getKey().toString();
                        arr2[i] = mapping.getValue().toString();
                
                        i++;
                    }
                


                进入二维数组。

                   String[][] arr = new String[hashmap.size()][2];
                   Set entries = hashmap.entrySet();
                   Iterator entriesIterator = entries.iterator();
                
                   int i = 0;
                   while(entriesIterator.hasNext()){
                
                    Map.Entry mapping = (Map.Entry) entriesIterator.next();
                
                    arr[i][0] = mapping.getKey().toString();
                    arr[i][1] = mapping.getValue().toString();
                
                    i++;
                }
                

                【讨论】:

                  【解决方案11】:

                  你也可以试试这个。

                  public static String[][] getArrayFromHash(Hashtable<String,String> data){
                          String[][] str = null;
                          {
                              Object[] keys = data.keySet().toArray();
                              Object[] values = data.values().toArray();
                              str = new String[keys.length][values.length];
                              for(int i=0;i<keys.length;i++) {
                                  str[0][i] = (String)keys[i];
                                  str[1][i] = (String)values[i];
                              }
                          }
                          return str;
                      }
                  

                  这里我使用 String 作为返回类型。您可以将其更改为所需的返回类型。

                  【讨论】:

                  • 问题是关于HashMap(),但你的解决方案是关于Hashtable()...它们之间有一些differences
                  【解决方案12】:

                  为了保证每个键和值数组的顺序正确,请使用这个(其他答案使用单独的Sets,不保证顺序。

                  Map<String, Object> map = new HashMap<String, Object>();
                  String[] keys = new String[map.size()];
                  Object[] values = new Object[map.size()];
                  int index = 0;
                  for (Map.Entry<String, Object> mapEntry : map.entrySet()) {
                      keys[index] = mapEntry.getKey();
                      values[index] = mapEntry.getValue();
                      index++;
                  }
                  

                  【讨论】:

                  • 完美!我们得到key和value,自动类型填充eclipse,找了很久,谢谢!
                  【解决方案13】:

                  CrackerJacks 建议的替代方案,如果您希望 HashMap 保持秩序,您可以考虑改用 LinkedHashMap。据我所知,它的功能与 HashMap 相同,但它是 FIFO,因此它保持添加项目的顺序。

                  【讨论】:

                    【解决方案14】:

                    如果您需要键和值,您可以随时通过entrySet

                    hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]
                    

                    您可以(当然)通过getKeygetValue 方法从每个条目中获取键

                    【讨论】:

                    • @CrackerJack9 不,它有效。与公认的解决方案不同,这个解决方案维护键值对。你得到{key, value}[] 而不是key[], value[]
                    • 这似乎是一个更好的解决方案
                    猜你喜欢
                    • 2014-07-20
                    • 2022-11-01
                    • 2018-07-16
                    • 1970-01-01
                    • 2017-11-04
                    • 1970-01-01
                    • 2019-02-03
                    • 1970-01-01
                    • 2013-06-16
                    相关资源
                    最近更新 更多