如何对给定的字符串模式使用Java正则表达式或Java streams并从中创建映射

如何对给定的字符串模式使用Java正则表达式或Java streams并从中创建映射,java,regex,java-8,java-stream,Java,Regex,Java 8,Java Stream,我有一个具有以下模式的字符串 String test = "name=ravi,age=30,id=1;name=teja,age=32,id=2"; 如上所示,“;”用于分隔人员,“;”用于分隔人员的属性,“=”用于映射这些属性的值 我想将上面的字符串转换为Map,其中外部映射的键是id,内部映射的键是name 考虑到总是保证字符串中有唯一的ID和名称,如何使用Java正则表达式或Java streams来实现这一要求 我本可以使用StringTokenizer或“split”方法来实现这一

我有一个具有以下模式的字符串

String test = "name=ravi,age=30,id=1;name=teja,age=32,id=2";
如上所示,“;”用于分隔人员,“;”用于分隔人员的属性,“=”用于映射这些属性的值

我想将上面的字符串转换为
Map
,其中外部映射的键是id,内部映射的键是name

考虑到总是保证字符串中有唯一的ID和名称,如何使用Java正则表达式或Java streams来实现这一要求

我本可以使用StringTokenizer或“split”方法来实现这一点,但我想看看是否有其他更好的方法来实现这一点

编辑:到目前为止,我已经做到了这一点

List<String> persons =
                Arrays.asList(test.split(";"));

        List<List<String>> personAttribs =
                persons.stream().map(s -> Arrays.asList(s.split(","))).collect(Collectors.toList());
列出人员=
Arrays.asList(test.split(“;”);
列出人物肋骨=
persons.stream().map(s->array.asList(s.split(“,”)).collect(Collectors.toList());

我无法将personAttribs转换为我正在寻找的地图。

完全是为了好玩:

    Pattern p2 = Pattern.compile(",");
    Pattern p3 = Pattern.compile("=");
    String[] tokens = test.split(";");

    for (String token : tokens) {
        List<String> list = p2.splitAsStream(token)
                .flatMap(x -> p3.splitAsStream(x))
                .collect(Collectors.toList());

        result.put(list.get(5), IntStream.of(0, 2)
                .boxed()
                .collect(Collectors.toMap(list::get, x -> list.get(x + 1))));
    }

    System.out.println(result); // {1={name=ravi, age=30}, 2={name=teja, age=32}}

绝对只是为了好玩:

    Pattern p2 = Pattern.compile(",");
    Pattern p3 = Pattern.compile("=");
    String[] tokens = test.split(";");

    for (String token : tokens) {
        List<String> list = p2.splitAsStream(token)
                .flatMap(x -> p3.splitAsStream(x))
                .collect(Collectors.toList());

        result.put(list.get(5), IntStream.of(0, 2)
                .boxed()
                .collect(Collectors.toMap(list::get, x -> list.get(x + 1))));
    }

    System.out.println(result); // {1={name=ravi, age=30}, 2={name=teja, age=32}}

您可以使用
split
方法轻松地完成此操作。@Azhy,是的,我可以使用
split
,但我想看看是否有一种方法可以使用正则表达式模式或java流来完成此操作。使用正则表达式或流可以实现各种不同的操作。你已经试过什么了?你能展示你已经试过的代码吗?你能给我看一个你试过但不起作用的正则表达式吗?你能显示你编写的流式处理的任何函数不起作用吗?@geneconomiss,用我试过的代码编辑了这个问题。请看看
年龄=30时会发生什么事?这也可以放在地图上吗?你可以很容易地使用
split
方法。@Azhy,是的,我可以使用
split
,但我想看看是否有一种方法可以使用正则表达式模式或java流。使用正则表达式或流可以实现你想要的功能。你已经试过什么了?你能展示你已经试过的代码吗?你能给我看一个你试过但不起作用的正则表达式吗?你能显示你编写的流式处理的任何函数不起作用吗?@geneconomiss,用我试过的代码编辑了这个问题。请看看
年龄=30时会发生什么事?那也放在地图上了吗?对不起,我离开了几天。您能帮我理解为什么要使用
list.get(5)
IntStream.of(0,2).boxed()
?我发现这很难理解,因为我对Java比较陌生streams@Ravi想想你的输入(一个标记)
name=ravi,age=30,id=1
,我所做的基本上就是把它转换成一个列表
name,ravi,age,30,id,1
现在,list.get(5)
在这种ca情况下将是
1
-这是您感兴趣的ID。这是
映射中的值。现在将您的
innerMap
看作
。。。你说你关心
姓名
年龄
。在初始的
列表
名称
位于位置0,其值位于位置
1
;因此,
IntStream.of(0,2)
将从该列表中获取零索引值,并将其用作内部映射(
name
)中的键,该值与我看到的值相同。谢谢你的解释@Eugene。很抱歉我离开了几天。您能帮我理解为什么要使用
list.get(5)
IntStream.of(0,2).boxed()
?我发现这很难理解,因为我对Java比较陌生streams@Ravi想想你的输入(一个标记)
name=ravi,age=30,id=1
,我所做的基本上就是把它转换成一个列表
name,ravi,age,30,id,1
现在,list.get(5)
在这种ca情况下将是
1
-这是您感兴趣的ID。这是
映射中的值。现在将您的
innerMap
看作
。。。你说你关心
姓名
年龄
。在初始的
列表
名称
位于位置0,其值位于位置
1
;因此,
IntStream.of(0,2)
将从该列表中获取零索引值,并将其用作内部映射(
name
)中的键,该值与我看到的值相同。谢谢你的解释@Eugene。非常有用