131

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

4

14 回答 14

212
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

编辑

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

于 2009-07-07T05:47:14.803 回答
73

如果您想要键和值,您可以随时通过以下方式执行此操作entrySet

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

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

于 2009-07-07T06:05:56.343 回答
57

如果你有HashMap<String, SomeObject> hashMap那么:

hashMap.values().toArray();

将返回一个Object[]. 相反,如果你想要一个 type 的数组SomeObject,你可以使用:

hashMap.values().toArray(new SomeObject[0]);
于 2011-04-15T21:05:49.877 回答
30

为了保证每个键和值数组的顺序正确,请使用这个(其他答案使用个人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++;
}
于 2011-08-07T18:26:33.633 回答
12

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

于 2011-11-16T14:52:38.513 回答
7

我使用的几乎与@kmccoy 相同,但keySet()我没有这样做

hashMap.values().toArray(new MyObject[0]);
于 2014-07-17T14:14:37.627 回答
6
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]);
    }
}
于 2010-09-16T12:55:45.513 回答
6

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

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

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

map.entrySet()
    .stream()
    .map(e -> new String[]{e.getKey(), e.getValue().toString()})
    .toArray(String[][]::new);
于 2019-05-27T22:30:02.153 回答
3

进入一维数组。

    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++;
}
于 2014-04-17T09:39:11.733 回答
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 ...}
于 2021-04-21T13:51:06.257 回答
0

你也可以试试这个。

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 作为返回类型。您可以将其更改为所需的返回类型。

于 2012-03-20T22:41:24.787 回答
0
@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;
    }
于 2017-03-16T15:01:10.373 回答
0
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);
于 2018-04-12T17:30:32.093 回答
0

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

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

Arraylist:
ArrayList<Object> object=new ArrayList<>(hashMap.values());
于 2021-04-09T13:45:21.153 回答