【发布时间】:2011-01-16 22:34:24
【问题描述】:
将 HashMap 转换为 2D 数组的最简单方法是什么?
【问题讨论】:
-
对于 Java 8+ 使用流:relative stack topic
将 HashMap 转换为 2D 数组的最简单方法是什么?
【问题讨论】:
使用 Java 8 流:
@Test
void testMapToArray() {
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", 2);
Object[][] arr =
map.entrySet().stream()
.map(e -> new Object[]{e.getKey(), e.getValue()})
.toArray(Object[][]::new);
System.out.println(Arrays.deepToString(arr));
}
输出:
[[key1, value1], [key2, 2]]
【讨论】:
怎么样
Object[][] array = new Object[][]{map.keySet.toArray(), map.entrySet.toArray()};
或者,更具体地了解类型,假设它们是 Strings:Set 的 toArray 采用提示参数,因此
String[][] array = new String[][]{map.keySet.toArray(new String[0]), map.entrySet.toArray(new String[0])};
编辑:几天后我才意识到,虽然这可能偶然起作用,但总的来说它不应该。原因是中间的Set;尽管它“由地图支持”,但似乎没有明确保证它会以任何特定顺序进行迭代。因此,key-array 和 entry-array 的顺序可能不一样,这肯定是一场灾难!
【讨论】:
map.keySet 和map.entrySet 而不是map.keySet() 和map.entrySet()
HashMap map = new HashMap();
Object[][] arr = new Object[map.size()][2];
Set entries = map.entrySet();
Iterator entriesIterator = entries.iterator();
int i = 0;
while(entriesIterator.hasNext()){
Map.Entry mapping = (Map.Entry) entriesIterator.next();
arr[i][0] = mapping.getKey();
arr[i][1] = mapping.getValue();
i++;
}
【讨论】:
使用 entrySet 遍历您的 Map,并使用 Entry 对象填充您的数组记录
【讨论】:
只有在key和value的类型相同时才能这样做。
给定:
HashMap<String,String> map;
我可以用这个简单的循环从这个地图创建一个数组:
String[][] array = new String[map.size()][2];
int count = 0;
for(Map.Entry<String,String> entry : map.entrySet()){
array[count][0] = entry.getKey();
array[count][1] = entry.getValue();
count++;
}
【讨论】: