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

bur*_*gar 110 java arrays collections hashmap

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

Lan*_*uhn 183

 hashMap.keySet().toArray(); // returns an array of keys
 hashMap.values().toArray(); // returns an array of values
Run Code Online (Sandbox Code Playgroud)

编辑

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

  • 键不会对应于两个数组中的值. (12认同)
  • 实际上,此代码不保证hashMap.keySet().toArray()[0]将成为原始Map中hashMap.values().toArray()[0]的原始键.所以这非常危险* (8认同)
  • @Jakobud landon9720是正确的...顺序是伪随机的,并且在将键转换为`Set`并将值转换为`Collection`后,无法保证key [0]将对应于值[0] .虽然它们在技术上被转换为数组(并回答了你的问题),但键值对的概念已经丢失 - 这就是为什么这是一个非常误导(和危险)的答案.... (5认同)
  • @CrackerJack9 你能解释一下吗? (2认同)
  • 我可以证明这段代码片段的危险性。当我写完的时候,我的终端伸出手来打了我一巴掌。极其危险!谨防! (2认同)

oxb*_*kes 63

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

hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]
Run Code Online (Sandbox Code Playgroud)

您可以从每个条目(当然)通过和方法获得密钥getKeygetValue


kmc*_*coy 49

如果你有的HashMap<String, SomeObject> hashMap

hashMap.values().toArray();

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

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

  • 您还可以通过预先指定数组大小而不是使用0来提高性能.请参阅此处的示例:http://stackoverflow.com/a/5061692/265877 (4认同)
  • 对于一个`SomeObject`数组,我认为你的意思是`values()`而不是`keySet()`. (3认同)

Cra*_*ck9 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++;
}
Run Code Online (Sandbox Code Playgroud)


Dea*_*ild 12

作为CrackerJacks建议的替代方案,如果您希望HashMap维护顺序,您可以考虑使用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]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Hug*_*res 6

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

hashMap.values().toArray(new MyObject[0]);
Run Code Online (Sandbox Code Playgroud)


Gra*_*ell 6

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

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

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

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