我有一个这样的“,”分隔的字符串数组

a b c d,
f b h j,
l p o i,


我希望将其转换为像
HashMap<String, List<String>>,以使列表中的第二个元素(由空格分隔成为键,而第三个元素变为值)
所以,
这应该成为

b -> c,h
p -> o


我想使用Streams API,我认为这是可行的方法:

List<String> entries = new ArrayList<>();
HashMap<String, List<String>> map = new HashMap<>();

HashMap<String, List<String>> newMap = entries.stream()
    .collect(line -> {
        if (map.contains(line.split(" ")[1])) {
            // Get existing list and add the element
            map.get(line.split(" ")[1].add(line.split(" ")[1]));
        } else {
            // Create a new list and add
            List<String> values = new ArrayList<>();
            values.add(line.split(" ")[1]);
            map.put(line.split(" ")[0], values);
        }
    });


有什么更好的办法吗?我究竟应该如何从collect函数返回Hashmap?

最佳答案

您可以使用如下所示的Collectors.groupingBy将输入分组(遵循内联注释):

String[] inputs = {"a b c d,", "f b h j,", "l p o i,"};
Map<String, List<String>> results =
     Arrays.stream(inputs).map(s -> s.split(" ")).//splt with space
     collect(Collectors.groupingBy(arr -> arr[1], // Make second element as the key
         Collectors.mapping(arr -> arr[2], // Make third element as the value
                            Collectors.toList())));//collect the values to List
 System.out.println(results);


输出:

{p=[o], b=[c, h]}


建议您阅读API here,以了解Collectors.groupingByCollectors.mapping的工作方式。

10-06 14:43