拆分字符串并将其存储到 HashMap java 8

新手上路,请多包涵

我想拆分下面的字符串并将其存储到 HashMap 中。

 String responseString = "name~peter-add~mumbai-md~v-refNo~";

首先,我使用定界符连字符 (-) 拆分字符串并将其存储到 ArrayList 中,如下所示:

  public static List<String> getTokenizeString(String delimitedString, char separator) {
    final Splitter splitter = Splitter.on(separator).trimResults();
    final Iterable<String> tokens = splitter.split(delimitedString);
    final List<String> tokenList = new ArrayList<String>();
    for(String token: tokens){
        tokenList.add(token);
    }
    return tokenList;
}
List<String> list = MyClass.getTokenizeString(responseString, "-");

然后使用以下代码使用流将其转换为 HashMap。

 HashMap<String, String> = list.stream()
                          .collect(Collectors.toMap(k ->k.split("~")[0], v -> v.split("~")[1]));

流收集器不工作,因为没有针对 refNo 的值。

如果我在 ArrayList 中有偶数个元素,它可以正常工作。

有什么办法可以解决这个问题吗?还建议我如何使用流来完成这两个任务(我不想使用 getTokenizeString() 方法)使用流 java 8。

原文由 Sangam Belose 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

除非 Splitter 正在做任何魔术,否则 --- getTokenizeString 方法在这里已过时。您可以将整个处理作为一个操作来执行:

 Map<String,String> map = Pattern.compile("\\s*-\\s*")
    .splitAsStream(responseString.trim())
    .map(s -> s.split("~", 2))
    .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: ""));

通过使用正则表达式 \s*-\s* 作为分隔符,您将空格视为分隔符的一部分,因此隐式地修剪了条目。在处理条目之前只有一个初始 trim 操作,以确保在第一个条目之前或最后一个条目之后没有空格。

然后,只需将条目拆分为 map 步骤,然后再收集到 Map

原文由 Holger 发布,翻译遵循 CC BY-SA 3.0 许可协议

首先,您不必将相同的 String 拆分两次。

其次,检查数组的长度以确定给定键是否存在值。

 HashMap<String, String> map=
    list.stream()
        .map(s -> s.split("~"))
        .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : ""));

这是假设如果键没有相应的值,您想要将键与 null 值放在一起。

或者您可以跳过 list 变量:

 HashMap<String, String> map1 =
    MyClass.getTokenizeString(responseString, "-")
        .stream()
        .map(s -> s.split("~"))
        .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : ""));

原文由 Eran 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题