将字符串列表拆分为地图列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将字符串列表拆分为地图列表相关的知识,希望对你有一定的参考价值。

我有以下列表[12_223,13_4356,15_5676]

我能够拆分下划线并使用下面的代码将其转换为一个Hashmap

list.stream()
    .map(s -> s.split("_"))
    .collect(Collectors.toMap(
        a -> a[0],
        a -> a[1]));

它给出了下面的地图{"12"="223", "13"="4356", "15"="5676"}

但我想更改此代码,以便它给我一个像下面的地图列表,因为我可能会在分割时遇到重复的键

[{"12"="223"}, {"13"="4356"}, {"15"="5676"}]

答案

如果你真的希望结果是一个地图列表,我会这样做:

List<Map<String, String>> listOfMaps(List<String> list) {
    return list.stream()
               .map(s -> s.split("_", 2))
               .map(a -> Collections.singletonMap(a[0], a[1]))
               .collect(toList());
}

(HT:Eugene推荐split("_", 2)。)

在Java 9中,您可以这样做:

List<Map<String, String>> listOfMaps(List<String> list) {
    return list.stream()
               .map(s -> s.split("_", 2))
               .map(a -> Map.of(a[0], a[1]))
               .collect(toList());
}

在这两种情况下,结果列表中的映射实例都是不可修改的。

另一答案

这可以满足您的需求

List<Map<String, String>> output = list.stream().map(
s-> {
        Map<String, String> element = new HashMap<>();
        String[] arr = s.split("_");
        element.put(arr[0], arr[1]);
        return element;
    }).collect(Collectors.toList());

但正如@Pshemo所说,这应该更合适

    Map<String, List<String>> outputnew = list.stream().map(
            s -> s.split("_"))
            .collect(Collectors.groupingBy(s -> s[0],  
                    Collectors.mapping(s -> s[1], Collectors.toList()))); 

以上是关于将字符串列表拆分为地图列表的主要内容,如果未能解决你的问题,请参考以下文章

c#如何将2D数组拆分为较小的2D数组(块)列表?

如何通过特定的字符串元素将字符串列表拆分为字符串的子列表

如何将逗号分隔的字符串拆分为字符串列表?

如何将字符串拆分为列表?

在每个谓词 scala 处将字符串列表拆分为多个列表

Python代码阅读(第25篇):将多行字符串拆分成列表