如何转换Map <string,set <string =“”>&gt;在Java中映射<string,string [] =“”>

时间:2015-08-24 09:06:14

标签: java arrays collections hashmap set

我从方法中以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);

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

您的解决方案几乎正常运行,因此您应该考虑以下几点:

  1. Iterator是通用类型,因此您不应该执行其他投射
  2. 明确使用Iterator毫无意义:for循环对每个Iterable隐含地执行此操作(Collection -> Set
  3. 您在key中仅使用Map.Entry,但您也可以使用值,无需另外拨打get两次
  4. 因此,转换将是:

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

答案 1 :(得分:0)

如果您使用的是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()]);
    }