-2

我收到了字符串

String message = "Value{A=10,B=20,C=30,D=700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST,E=40,F=50}";
Map<Object, Object> = {
       A = 10 ,
       B = 20
       C = 30
       D = 700-2-1, Bourke STREET, SOUTH 100/28 QUEEN ST
       E = 40
       F = 50
}

我正在寻找一种通用的方法。在哪里

  1. 需要 A、B、C 的所有值 ....

  2. A、B、C、D、E、F的顺序会改变

  3. 只有 D 可以在其值中包含单个或多个逗号 (,) 或不包含逗号

4

2 回答 2

1

我在想String.split()。我们首先要以逗号分隔大括号内的消息部分,然后以等号分隔。但是,显然不是每个逗号。仅在新键字母和等号之前的逗号处。在代码中:

String message
     = "Value{A=10,B=20,C=30,"D=700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST,E=40,F=50}";

String contents = message.replaceFirst("^Value\\{(.*)\\}$", "$1");
String[] pairs = contents.split(",(?=[ABCDEF]=)");
Map<String, String> m = Arrays.stream(pairs)
        .map(p -> p.split("=", 2))
        .collect(Collectors.toMap(a -> a[0], a -> a[1]));

m.forEach((k, v) -> System.out.println(k + " -> " + v));

输出是:

A -> 10
B -> 20
C -> 30
D -> 700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST
E -> 40
F -> 50

(?=[ABCDEF]=)在第二个正则表达式中是积极的前瞻。它确保我们只匹配逗号,如果它后面跟着这些字母之一和 en 等号。如果字母可以不是 ABCDEF,您可能希望使用\w单词字符而不是[ABCDEF].

我们不一定需要流操作,但您已经标记了您的问题 java-stream,所以我想您希望看到一个。

流操作不能保证给你一个HashMap. 即使您观察到它确实如此(在我的例子中是在 Java 11 上实现的),它可能不会出现在下一个 Java 版本上,甚至可能不会出现在不同的输入中。对于大多数情况,这应该是无关紧要的。如果您有特定原因需要确定,请检查您得到的内容,如果不是,请转换HashMap

if (! m.getClass().equals(HashMap.class)) {
    m = new HashMap<>(m);
}
于 2020-05-03T08:44:10.663 回答
0

此代码适用于上述情况:


public static void main(String... args) {
        String message = "Value{A=10,B=20,C=30,D=700-2-1, Bourke STREET, SOUTH 2/28 QUEEN ST,E=40,F=50}";
        //remove value and curly braces
        message = message.substring(6,message.length()-1);
        //split by comma followed by capital letter
        String[] values= message.split("(?<=,)(?=[A-Z])");      
        //split and collect to map
        Map<String, String> map = Arrays.asList(values).stream()
        .map(x-> x.lastIndexOf(",")>-1?x.substring(0, x.lastIndexOf(",")):x)
        .map(x-> x.split("="))      
        .collect(Collectors.toMap(x -> x[0], x-> x[1]));
        //print map 
        System.out.println(map);
    }
于 2020-05-03T08:39:38.013 回答