【问题标题】:How to split a string and grouping all the info into a map with duplication values using Java 8 Stream?如何使用 Java 8 Stream 拆分字符串并将所有信息分组到具有重复值的映射中?
【发布时间】:2017-06-03 13:07:09
【问题描述】:

我有以下字符串:

"id1:name1,id2:name1,id3:name2,id4:name2,id5:name2"

我想把这个字符串转换成如下形式的映射:

{name2=[id3, id4, id5], name1=[id1, id2]}

我的要求与这个问题相同:How to split a string into a map with a list of values? 但是,我怎样才能使用 Java 8 Stream API 做到这一点?

【问题讨论】:

  • 你至少尝试过什么吗?
  • 你应该把你的错误代码放在第一位。而不是让我们解决你的任务。
  • 是的,我可以将项目分组到地图中而不会重复。但我想要的是重复的 id 应该被分组到一个列表中。

标签: java java-8 java-stream


【解决方案1】:

根据您正在寻找流解决方案的标签。这是一个

String text = "id1:name1,id2:name1,id3:name2,id4:name2,id5:name2";
Map<String, List<String>> map = Arrays
        .stream(text.split(","))
        .map(pair -> pair.split(":"))
        .collect(Collectors.groupingBy(
                    pair -> pair[1], 
                    Collectors.mapping(e -> e[0], Collectors.toList())
                )
        );

System.out.println(map);

输出:{name2=[id3, id4, id5], name1=[id1, id2]}

【讨论】:

    【解决方案2】:

    您可以使用以下代码:

    public static void main(String[] args) {
        String input = "id1:name1,id2:name1,id3:name2,id4:name2,id5:name2";
        String[] pairs = input.split(",");
        Map<String, String> result = Stream.of(pairs)
                .map(pair -> pair.split(":"))
                .collect(Collectors.toMap(
                        splittedPair -> splittedPair[1], // to key function (extracts name)
                        splittedPair -> splittedPair[0], // to value function ( extracts id)
                        (id1, id2) -> id1 + "," + id2)); // in case of same name merges id
    
        System.out.println(result);
    }
    

    输出如下:{name2=id3,id4,id5, name1=id1,id2}

    如果您需要 Map&lt;String, List&lt;String&gt;&gt; 作为结果,您可以使用以下收集器:

    Map<String, List<String>> result = Stream.of(pairs)
            .map(pair -> pair.split(":"))
            .collect(Collectors.toMap(
                splittedPair -> splittedPair[1],
                splittedPair -> {
                    List<String> ids = new ArrayList<>();
                    ids.add(splittedPair[0]);
                    return ids;
                },
                (idList1, idList2) -> {
                    idList1.addAll(idList2);
                    return idList1;
                }));
    

    【讨论】:

    【解决方案3】:

    StreamEx 总是有更简单的方法:

    StreamEx.of(text.split(",")).map(p -> p.split(":"))
                                .mapToEntry(p -> p[1], p -> p[0]).grouping();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 2021-05-09
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 2022-01-07
      • 2023-03-28
      • 2016-08-04
      相关资源
      最近更新 更多