Java:如何将HashMap <String,Object>转换为数组


116

我需要将a转换HashMap<String, Object>为数组;谁能告诉我它是如何完成的?


4
您想要键,值还是两者兼而有之?
harto

Answers:


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

编辑

应当注意,两个数组的顺序可能不相同。需要对键/值对时,请参见oxbow_lakes答案以获得更好的迭代方法。


9
实际上,此代码无法保证hashMap.keySet()。toArray()[0]将成为原始Map中hashMap.values()。toArray()[0]的原始键。因此,这非常危险
CrackerJack9

2
@ CrackerJack9你能解释吗?
杰克·威尔逊

12
键不会与它们在两个数组中的值相对应。
Landon Kuhn

5
@Jakobud landon9720是正确的...顺序是伪随机,在将键转换为a Set并将值转换为a后,不能保证key [0]将对应于value [0] Collection。尽管它们在技术上转换为数组(并回答了您的问题),但键值对的概念却丢失了-这就是为什么这是一个非常令人误解(且很危险)的答案的原因。–
CrackerJack9

我可以证明此代码段的危险。当我写它的时候,我的终端伸出手打了我耳光。极度危险!谨防!
artburkart

65

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

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

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


@ CrackerJack9不,它有效。与公认的解决方案不同,此解决方案维护键值对。您会遇到{key, value}[]反对key[], value[]
Tobiq

51

如果有的HashMap<String, SomeObject> hashMap话:

hashMap.values().toArray();

将返回Object[]。相反,如果要使用类型的数组,则SomeObject可以使用:

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

3
我认为您的意思values()不是keySet()代表SomeObject
Paul Bellora

4
您也可以通过预先指定数组大小而不使用0来提高性能。请参见此处的示例:stackoverflow.com/a/5061692/265877
Alex

@Alex“建议在较早的Java版本中使用预先设置大小的数组(...)但是,由于OpenJDK 6的更新较晚,因此此调用引起了人们的注意,与以前的版本相比,空数组版本的性能相同,甚至更好。传递预先大小的数组对于并发或同步集合也是危险的,因为在size和toArray调用之间可能会发生数据争用,如果在收集期间同时缩小了集合,则可能在数组末尾产生额外的null操作。” -intellij
汉堡很不错,

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++;
}

完善!我们得到键和值,自动类型填充eclipse,很长一段时间都在寻找,谢谢!
水瓶座力量

12

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



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

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++;
}

2

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

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

如果您Object的是,String而您需要一个String[][],请尝试:

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

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


1
问题是关于HashMap()但您的解决方案是关于Hashtable()... 它们之间有一些区别
Choletski

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

0
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);
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.