【问题标题】:Split string into parts in java to put it in a map在java中将字符串拆分为多个部分以将其放入地图中
【发布时间】:2020-10-19 14:09:03
【问题描述】:

我一直在尝试从字符串中获取所有值,并以下列方式将它们放入映射中:

所以我有一个这样的字符串:

String cookies = "i=lol;haha=noice;df3=ddtb;"

到目前为止,我一直在尝试:

final Map<String, String> map = new HashMap<>();
map.put(cookies.split(";")[0].split("=")[0], cookies.split(";")[0].split("=")[1]);

但是这样我只能输入一个值,而且它又长又丑。正则表达式或循环是否有任何原因?

【问题讨论】:

  • 使用 for 循环很容易处理,将 cookies.split(";") 的值存储在变量中并遍历其内容

标签: java split hashmap


【解决方案1】:

您可以使用循环遍历键值对并将它们放入映射中:

String[] cookieArr = cookies.split(";");
for(String cookieString : cookieArr){
  String[] pair = cookieString.split("=");
  if(pair.length < 2){
    continue;
  }
  map.put(pair[0], pair[1]);
}

if 仅用于在 cookie 字符串格式错误时防止 ArrayIndexOutOfBounds 异常

替代方案将使用流:

Arrays.stream(cookies.split(";")).forEach(cookieStr -> map.put(cookieStr.split("=")[0], cookieStr.split("=")[1]));

正如@WJS 在评论中提到的,您可以使用map.putIfAbsent(key, vlaue) 而不是map.put(key, value) 来防止覆盖值。但在 cookie 的情况下,用新值覆盖旧值可能是一种理想的行为。

【讨论】:

  • 啊谢谢我试试看,还有为什么pair.length
  • @ShivanshPotdar 可能是,cookie 已损坏,类似于“测试”(无 = 符号),因此它应该继续并且不会引发异常
  • 缺少来自 OP 的任何其他方向,您可能希望使用 map.putIfAbsent() 来处理重复的关键场景。
  • @WJS 谢谢,将其添加为答案的选项。在 cookie 场景中,覆盖旧值可能会更好
【解决方案2】:

你可以这样做。它假定您的格式是一致的。

  • 首先在“;”上分割每个 k/v 对
  • 将“=”拆分为键和值。
  • 并添加到地图中。
  • 如果出现重复键,则遇到的第一个优先(如果您想要重复键的最新值,则使用 (a, b)-&gt; b 作为合并 lambda。)
String cookies = "i=lol;haha=noice;df3=ddtb";
Map<String, String> map = Arrays.stream(cookies.split(";"))
        .map(str -> str.split("=")).collect(Collectors
                .toMap(a -> a[0], a->a[1], (a, b) -> a));
map.entrySet().forEach(System.out::println);

打印

df3=ddtb
haha=noice
i=lol

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2015-02-02
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多