如何对给定的字符串模式使用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。非常有用