使用java流将字符串拆分为Map

7bsow1i6  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(551)

我想拆分以下字符串并将其存储到Map中。

String = "key_a:<value_a1>\r\n\r\nkey_b:<value_b1>\r\n\r\nkey_c:<value_c1, value_c2, value_c3>"

字符串可以在对之间有换行符。一个键可以有多个由 , 从一个 < 以一个 > .
现在这个字符串需要转换为 Map<String, List<String>> .
Map的结构应如下所示:

key_a={value_a1}, 
key_b={value_b1}, 
key_c={value_c1, value_c2, value_c3}

我目前只有将不同的键值对彼此分开的逻辑,但我不知道如何实现将值彼此分开、移除括号和Map属性的逻辑。

String strBody = "key_a:<value_a1>\r\n\r\nkey_b:<value_b1>\r\n\r\nkey_c:<value_c1, value_c2, value_c3>"

Map<String, List<String>> map = Pattern.compile("\\r?\\n")
            .splitAsStream(strBody)
            .map(s -> s.split(":"))
               //...logic for splitting values apart from each other, removing <> brackets and storing it in the map           
            )
4dbbbstv

4dbbbstv1#

您的输入有两个 \r\n 要分离条目,还需要将其拆分,否则将得到空条目,然后需要过滤掉。
在流中处理字符串之前,我会从字符串中移除尖括号。只剩下收集的步骤了。

Map<String, String> map = Pattern.compile("\\r?\\n\\r?\\n")
    .splitAsStream(strBody.replaceAll("[<>]",""))
    .map(s -> s.split(":"))
    .collect(Collectors.toMap(e -> e[0], e-> e[1]));
y1aodyip

y1aodyip2#

另一种方法也可以拆分值列表:

Map<String,List<String>> result = 
     Pattern.compile("[\\r\\n]+")
        .splitAsStream(strBody)
        .map(s -> s.split(":"))
        .map(arr -> new AbstractMap.SimpleEntry<>(
                            arr[0],
                            Arrays.asList(arr[1].replaceAll("[<>]", "").split("\\s*,\\s"))))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
bnlyeluc

bnlyeluc3#

试试这个。

String strBody = "key_a:<value_a1>\r\n\r\nkey_b:<value_b1>\r\n\r\nkey_c:<value_c1, value_c2, value_c3>";
Map<String, List<String>> result = Arrays.stream(strBody.split("\\R\\R"))
    .map(e -> e.split(":", 2))
    .collect(Collectors.toMap(a -> a[0],
        a -> List.of(a[1].replaceAll("^<|>$", "").split("\\s,\\s*"))));
System.out.println(result);

输出

{key_c=[value_c1, value_c2, value_c3], key_b=[value_b1], key_a=[value_a1]}
rsl1atfo

rsl1atfo4#

您可以筛选具有两个值的数组,然后使用collectors.groupingby将元素分组到 Map ,你可以在这里找到更多关于 groupingBy 和`mapping

Map<String, List<String>> map = Pattern.compile("\\r?\\n")
            .splitAsStream(strBody)
            .map(s -> s.split(":"))
            .filter(arr -> arr.length == 2)
            .collect(Collectors.groupingBy(arr -> arr[0],
                    Collectors.mapping(arr -> arr[1].replaceAll("[<>]", ""), 
                            Collectors.toList())));

相关问题