代码之家  ›  专栏  ›  技术社区  ›  Jeeppp

将字符串列表拆分为映射列表

  •  1
  • Jeeppp  · 技术社区  · 8 年前

    我有以下清单 [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"}]

    2 回复  |  直到 8 年前
        1
  •  5
  •   Stuart Marks    8 年前

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

    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:尤金推荐 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());
    }
    

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

        2
  •  1
  •   Alanpatchi    8 年前

    这就是你想要的

    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())));