我有一个以特定格式传入的字符串,因此我想将该字符串解析为map。我有一个下面的方法,它将String解析为Map,并且工作正常。

  public static Map<String, String> parseStringToMap(String payload) {
    try {
      return Maps.newHashMap(Splitter.on("|").withKeyValueSeparator("=").split(payload));
    } catch (Exception ex) {
      return ImmutableMap.of();
    }
  }


字符串的示例示例:

"type=3|Id=23456|user=13456"


现在有时候,当我在相同的String payload中两次使用相同的键且具有相同的值时,我的上述方法将失败并抛出异常。例如对于下面的字符串,它不起作用并且失败,然后返回空映射,因为它具有两次type键。

"type=3|Id=23456|user=13456|type=3"


我该怎么做才能解决此问题,而不是解决字符串有效载荷?因此,假设同一个键多次出现,则覆盖映射中的键值而不是失败。我想返回一个Mutable映射。

我仍在使用Java7。什么是最好的,最有效的方法?

最佳答案

我不知道在Guava中可以做到这一点,但是用普通的旧Java并不是很难:

Map<String, String> map = new HashMap<>();
for (String part : payload.split("\\|")) {
  String[] subparts = part.split("=", 2);
  map.put(subparts[0], subparts[1]);
}
return map;


如果您只想检查字符串的格式是否正确(即,存在用竖线分隔的元素,每个元素都包含一个=符号),则可以使用indexOf查找以下内容:

int start = 0;
while (start < payload.length()) {
  int end = payload.indexOf('|', start);
  if (end == -1) {
    end = payload.length();
  }

  int equalsPos = payload.indexOf('=', start);
  if (equalsPos > end || equalsPos < 0) {
    // No = found between adjacent |s. Not valid format.
    return Collections.emptyMap();
  }

  // Extract the substrings between | and =, and = and the next |.
  map.put(payload.substring(start, equalsPos), payload.substring(equalsPos + 1, end));

  start = end + 1;
}

10-07 19:17
查看更多