将哈希映射表转换成二维数组

19

如何将HashMap转换为二维数组?


对于Java 8+,可以使用流(Streams)来实现:相关的Stack Overflow话题 - Алексей Виноградов
5个回答

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

现在我们有流,我们能否创建一行代码呢? - Simon Baars
在这里查看使用Java 8流的一行代码 链接 - Somu

9

只有当键和值的类型相同时才能执行此操作。

给定:

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

8

你能行吗?

Object[][] array = new Object[][]{map.keySet.toArray(), map.entrySet.toArray()};

或者更具体地说,如果它们是 Strings 类型: SettoArray 方法需要一个提示参数,因此

String[][] array = new String[][]{map.keySet.toArray(new String[0]), map.entrySet.toArray(new String[0])};

编辑: 几天后我才意识到,虽然这个方法可能偶尔可行,但通常不应该这样做。原因是中间的Set虽然“由映射支持”,但似乎没有明确保证它会按任何特定顺序迭代。因此,键和条目数组可能不会以相同的顺序排列,这肯定是灾难性的!


我很喜欢你的方法,因为你能够用一行代码实现。但是,为什么你使用 map.keySetmap.entrySet 而不是 map.keySet()map.entrySet() 呢? - Qohelet

0

使用Java 8 Stream:

@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]]

-1

使用entrySet迭代您的Map,并使用Entry对象填充您的数组记录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接