如何将二维数组收集到 Map<String, Set<String>> 中?

Jin*_*won 5 java arrays hashmap java-stream collectors

我有一个由两个字符串组成的数组的数组。

var array = new String[][]{
    {"a", "1"},
    {"a", "2"},
    {"b", "3"},
    ...
};
Run Code Online (Sandbox Code Playgroud)

如何将上面的数组收集到一个数组中,Map<String, Set<String>>其键是每个数组的第一个元素,值是数组的第二个元素的集合?

这样我就可以得到下面的地图?

// Map<String, Set<String>>
<"a", ["1, "2"]>,
<"b", ["3"]>,
...
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现我可以像这样对每个数组的第一个元素进行分类。

var array = new String[][]{
    {"a", "1"},
    {"a", "2"},
    {"b", "3"},
    ...
};
Run Code Online (Sandbox Code Playgroud)

azr*_*zro 2

你需要一个Collectors.mapping(也不需要String[]在里面指定)

var array = new String[][]{{"a", "1"}, {"a", "2"}, {"b", "3"},};

Map<String, Set<String>> res = Arrays.stream(array).collect(Collectors.groupingBy(
        a -> a[0],
        Collectors.mapping(a -> a[1], Collectors.toSet())
));

System.out.println(res); // {a=[1, 2], b=[3]}
Run Code Online (Sandbox Code Playgroud)