java - 将格式化字符串解析为多次具有相同键的映射?

标签 java hashmap guava splitter

我有一个特定格式的字符串,所以我想将该字符串解析为映射。我有一个下面的方法,它将字符串解析为映射,并且工作正常。

  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"

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

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

我可以做什么来解决这个问题而不是修复字符串有效负载?因此,假设如果相同的键出现多次,则覆盖映射中的该键值而不是失败。我想返回一个可变映射。

我仍在使用 Java 7。执行此操作的最佳且有效的方法是什么?

最佳答案

文档说如果有重复的键, split 将抛出异常:

@CheckReturnValue public Map split(CharSequence sequence)

Splits sequence into substrings, splits each substring into an entry, and returns an unmodifiable map with each of the entries. For example, Splitter.on(';').trimResults().withKeyValueSeparator("=>") .split("a=>b ; c=>b") will return a mapping from "a" to "b" and "c" to b.

The returned map preserves the order of the entries from sequence.

Throws: IllegalArgumentException - if the specified sequence does not split into valid map entries, or if there are duplicate keys

所以,您不能使用 MapSplitter 的分割,抱歉!

使用 Java 8:

    return Splitter
        .on("|")
        .splitToList(payload)
        .stream()
        .map(kv -> kv.split("="))
        .collect(Collectors.toMap(kv -> kv[0], kv -> kv[1], (d1, d2) -> d1));

关于java - 将格式化字符串解析为多次具有相同键的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46352440/

相关文章:

java - Java 中与 (&&) 关系的映射

java - Sybase 存储过程返回多结果集

c++ - 大条目的慢 std::map

c++ - 是否可以比使用 hashmap 更快地将字符串映射到 int?

spring - Redis 与 Guava 缓存

java - 有没有办法连接字符串,每个字符串都有一个特定的周围字符串?

java - Spring Boot 和 Angular 身份验证 - 如何保护应用程序?

java - 如何使用不会导致 "uses unchecked or unsafe operations"警告的泛型实现 java 类

java ->>> 使用继承的 Hibernate 示例 <<<

java - HashMap 类型找不到符号