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

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

字符串的示例示例:
"type=3|Id=23456|user=13456"
"type=3|Id=23456|user=13456|type=3"

相同的键可能在相同的字符串有效负载中出现多次,因此我需要在可变映射中覆盖该键的值。

另外,如果我的字符串有效载荷不是以下格式,那么我想返回空映射。我的字符串格式将始终是这种格式,如果不是这种格式,那么我将返回空映射。现在,我不确定如何添加此逻辑,以便在出现这种情况时可以返回空映射?
"a=b|c=d|e=f"

我正在使用Java7。最佳的和有效的方法是什么?

我的规格是仅此。我的字符串将始终采用以下格式:
"a=b|c=d|e=f"

它永远不会以任何特殊字符开头。

最佳答案

使用正则表达式来确保传入的有效负载字符串具有正确的格式:

public static Map<String, String> parseStringToMap(String payload) {
    Map<String, String> map = new HashMap<>();
    if (!payload.matches("[A-Za-z0-9]+=[A-Za-z0-9]+(\\|[A-Za-z0-9]+=[A-Za-z0-9]+)*")) {
        // return empty map
        return map;
    }

    // your original code here
}

考虑到您担心同一键会多次出现,哈希映射的默认行为是覆盖,因此在这种情况下您可能已经被覆盖。只需在键/值对出现时对其进行写操作,您就会自动用新值覆盖旧值。

09-10 02:31
查看更多