Java 如何将特定格式的字符串解析为HashMap?

Java 如何将特定格式的字符串解析为HashMap?,java,parsing,hashmap,Java,Parsing,Hashmap,我有一个特殊格式的字符串,所以我想将该字符串解析为map。我有一个下面的方法,它可以将字符串解析成一个映射,并且效果很好 public static Map<String, String> parseStringToMap(String payload) { Map<String, String> map = new HashMap<>(); try { for (String part : payload.split("\\|

我有一个特殊格式的字符串,所以我想将该字符串解析为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;
  }
同一个键可能会在同一字符串负载中出现多次,因此我需要在可变映射中覆盖该键的值

另外,如果我的字符串负载不是下面的格式,那么我想返回空映射。我的字符串格式将始终是这样的,如果不是这种格式,那么我将返回空映射。现在我不确定如何添加此逻辑,以便在出现这种情况时返回空映射

"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
}
公共静态映射parseStringToMap(字符串负载){
Map Map=newhashmap();
如果(!payload.匹配(“[A-Za-z0-9]+=[A-Za-z0-9]++(\\\\|[A-Za-z0-9]+=[A-Za-z0-9]+])){
//返回空映射
返回图;
}
//您的原始代码在这里
}

关于同一个键多次出现的问题,hashmap的默认行为是覆盖,因此本例中可能已经介绍了您。只要在出现键/值对时编写它们,就会自动用新值覆盖旧值。

Regex看起来不错。但是当我用这个字符串测试它时,它不会返回空映射,并且这个格式与我的规范不匹配。你从来没有提到过冒号有特殊的含义。我不会对我的答案进行无限制的更改以满足您的要求。如果您告诉我们规格,可能会对我的答案进行简单的更新。我的规格是,我的字符串将始终采用此格式
“a=b | c=d | e=f”
。它前面不会有任何特殊字符。@user1950349那么你为什么要抱怨
: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
}