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

标签 java regex java-8 java-stream

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

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/

相关文章:

java - 工厂设计模式和DAO设计模式有什么区别

java - 如何在 Java 中编写一个只允许数字 0-9 和 # 的正则表达式

java - 在 Java 8 上为 Maven 单元测试设置时区

java - Java 日历中的前一天不正确

java - 在Javafx中动态改变矩形的颜色

java - 如何更改谷歌地图标记上方标题和 fragment 的设计

java - 如何使用Java进程运行python管道命令?

java - 我的 Rent 数组中的 LocalDate 要求我将其转换为 String

php - 正则表达式适用于 Javascript 但不适用于 PHP preg_match

正则表达式匹配除引号之间的单词之外的所有内容