如何将 Map<String, Set<String>> 转换为 Java 中的 Map<String, String[]>

How to convert Map<String, Set<String>> to Map<String, String[]> in Java

我正在从一个方法中获取 Map<String, Set<String>> 形式的数据。但我希望它采用 Map<String, String[]>.

的形式

即,我只想将映射值从 Set<String> 转换为特定键的 String[] 数组。

我试过这种方法,迭代加载的集合映射并为一个键正确获取值的 String[] 数组。

但我只想知道,有没有比这更好的解决方案

Map<String, Set<String>> testmap = new HashMap<String, Set<String>>();
        Map<String, String[]> testmapArray = new HashMap<String, String[]>();
        Set<String> testSet = new TreeSet<String>();
        testSet.add("1");
        testSet.add("2");
        testSet.add("3");

        testmap.put("A", testSet);
        testmapArray.put("A", testSet.toArray(new String[testSet.size()]));

        Set<String> testSet1 = new TreeSet<String>();
        testSet1.add("4");
        testSet1.add("5");
        testSet1.add("6");

        testmap.put("B", testSet1);
        testmapArray.put("A", testSet1.toArray(new String[testSet1.size()]));

        System.out.println(testmap);

        Iterator it = testmap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry)it.next();
            testmapArray.put(pair.getKey().toString(), testmap.get(pair.getKey()).toArray(new String[testmap.get(pair.getKey()).size()]));
        }
        System.out.println(testmapArray);

谁能帮帮我?

您的解决方案即将奏效,因此您应该考虑以下几点:

  1. Iterator 是泛型,所以你不应该做额外的转换
  2. 显式使用 Iterator 没有意义:for 循环隐式地为每个 IterableCollection -> Set 是)
  3. 您在 Map.Entry 中仅使用了 key,但您也可以使用值,无需再调用 get 两次

因此,转换为:

for (Map.Entry<String, Set<String>> entry: testmap.entrySet()) {
    testmapArray.put(entry.getKey(),
            entry.getValue().toArray(new String[entry.getValue().size()]));
}

如果您使用的是 Java 8,那么您可以使用流来实现它:

testmapArray = testmap.entrySet().stream().collect(Collectors.toMap(entry ->  entry.getKey(), entry-> setToArray(entry.getValue())));

方法setToArray是:

private static String[] setToArray(Set<String> set) {
        return set.toArray(new String[set.size()]);
    }