当前位置: 首页 > 知识库问答 >
问题:

用Java-Stream映射转换的字符串和结果映射中的duplicate in值

公冶安怡
2023-03-14

您能帮我找出更好的解决方案吗?下一种情况:Web元素属性以字符串形式收集,格式为:

animation-delay:0s;animation-direction:normal;animation-duration:0s;

目标:创建属性及其值的映射 。注意:属性中的值duplicates是可能的,例如“none”。

List<String> list = Arrays.stream(attributes.split(";")).collect(Collectors.toList());
Map<String, String> map = new HashMap<>();
for (String s : list) map.put(s.split(":")[0], s.split(":")[1]);
Arrays.stream(attributes.split(";"))
                .distinct()
                .map(entry -> entry.split(":"))
                .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));

共有1个答案

羊慈
2023-03-14

这应该通过映射到某个表示键-值对的对象来完成,在最简单的情况下,它可以是字符串的列表/数组,然后使用Collectors.tomap将这些对收集到Map:

String attributes = "width:100px;height:100px;animation-delay:0s;"
    + "animation-direction:normal;animation-duration:0s;font-family:Arial;"
    + "font-family:Helvetica;font-family:sans-serif";

Map<String, String> map = Arrays.stream(attributes.split(";"))
        .map(pair -> pair.split(":"))
        .filter(arr -> arr.length > 1) // keep only key:value pairs
        .collect(Collectors.toMap(
            arr -> arr[0], 
            arr -> arr[1], 
            (v1, v2) -> String.join(", ", v1, v2) // merge values if needed
            , LinkedHashMap::new // optional argument to keep insertion order
        ));

map.forEach((k, v) -> System.out.printf("%s: %s%n", k, v));

输出:

width: 100px
height: 100px
animation-delay: 0s
animation-direction: normal
animation-duration: 0s
font-family: Arial, Helvetica, sans-serif

也可以使用集合器收集映射。GroupingBy+集合器。Mapping+集合器。Joining:

Map<String, String> map = Arrays.stream(attributes.split(";"))
        .map(pair -> pair.split(":"))
        .filter(arr -> arr.length > 1) // keep only key:value pairs
        .collect(Collectors.groupingBy(
            arr -> arr[0], 
            TreeMap::new, // optional, sort by keys
            Collectors.mapping(arr -> arr[1], Collectors.joining(", "))
        ));

输出:

animation-delay: 0s
animation-direction: normal
animation-duration: 0s
font-family: Arial, Helvetica, sans-serif
height: 100px
width: 100px
 类似资料:
  • 这个问题不难,我已经用自己的方法解决了,但我想听听你的意见,也许有什么方法可以让这成为一个改进的选择?Java 8-11。

  • 假设我有一个,我想替换一个值映射,例如: 顺便说一下,字符串也可以是多个字符

  • 问题内容: 当我用Java进行操作时,我在stdout中得到了很好的输出。在不干预标准输出的情况下,如何在变量中获得相同的a字符串表示形式?像什么? 问题答案: 使用。 所有的亦是在此之后是做头套下。地图的格式在中描述。 返回此映射的字符串表示形式。字符串表示形式由键值映射列表组成,这些键值映射由地图视图的迭代器返回,并用大括号(“ {}”)括起来。相邻的映射用字符“,”(逗号和空格)分隔。每个键

  • 在映射上分配一些默认值 我知道我需要在地图中添加值 问题是我的循环不起作用。我需要从地图中添加value2,基于从那里的位置或从地图中添加value2