我有一个具有以下模式的字符串,
String test = "name=ravi,age=30,id=1;name=teja,age=32,id=2";
正如你在上面看到的,“;”用于分隔人,“,”用于分隔人的属性,“=”用于映射这些属性的值。
我想将上面的字符串转换成 Map<String, Map<String, String>>
其中外部映射的键是 id,内部映射的键是名称。
鉴于始终保证在整个字符串中具有唯一的 ID 和名称,我如何使用 Java 正则表达式或 Java 流来满足要求?
我本可以使用 StringTokenizer 或“split”方法完成此操作,但我想看看是否有任何其他更好的方法来执行此操作。
编辑:到目前为止我已经走到这一步了
List<String> persons =
Arrays.asList(test.split(";"));
List<List<String>> personAttribs =
persons.stream().map(s -> Arrays.asList(s.split(","))).collect(Collectors.toList());
我无法获取 personAttribs 并将其转换为我正在寻找的 map 。
最佳答案
绝对只是为了好玩:
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}}
使用 java-9
这可能会更好:
Pattern p = Pattern.compile(";");
Pattern p2 = Pattern.compile(",");
Pattern p3 = Pattern.compile("=");
List<String> list = p.splitAsStream(test)
.flatMap(p2::splitAsStream)
.flatMap(p3::splitAsStream)
.collect(Collectors.toList());
Map<String, Map<String, String>> result = IntStream.iterate(5, x -> x + 6)
.limit(list.size() / 6)
.boxed()
.collect(Collectors.toMap(
list::get,
x -> Map.of(
list.get(x - 5),
list.get(x - 4),
list.get(x - 3),
list.get(x - 2))));
关于java - 如何对给定的字符串模式使用 Java 正则表达式或 Java 流并从中创建映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827567/