gpt4 book ai didi

string - 将字符串中的键值对拆分为 HashMap,在一行中

转载 作者:行者123 更新时间:2023-12-03 11:36:34 25 4
gpt4 key购买 nike

我有一个字符串,内容如下:

key1:value1 key2:value2 key3:value3 ...
我想以 HashMap<&str, &str> 结束(或等效的),它映射字符串中的键和值(例如,“key1”的哈希查找应返回“value1”)。
目前,我可以使用以下内容轻松填充 HashMap:
let mut hm = HashMap::new();
for item in my_string.split_ascii_whitespace() {
let splits = item.split(":").collect::<Vec<&str>>();
hm.insert(splits[0], splits[1]);
}
但是,如果我想在一行中完成它怎么办(即使是以可读性为代价,出于“代码高尔夫”之类的目的)?我知道如何用 HashSet 做到这一点,所以我想它看起来有点相似;也许是这样的(实际上并没有编译):
let hm: HashMap<&str, &str> = HashMap::from_iter(my_string.split_ascii_whitespace().map(|s| s.split(":").take(2).collect::<Vec<&str>>()));
我尝试了与上述类似的不同组合,但我似乎无法找到可以实际编译的东西。

最佳答案

我解决这个问题的方法是记住可以将 Iterator<Item=(K, V)> 收集到 HashMap<K, V> 中,因此在知道我向后工作以试图找出如何将 &str 转换为 Iterator<Item=(&str, &str)> 后,我设法使用 String 0769104 方法和 find 方法做到了:

use std::collections::HashMap;

fn one_liner(string: &str) -> HashMap<&str, &str> {
string.split_whitespace().map(|s| s.split_at(s.find(":").unwrap())).map(|(key, val)| (key, &val[1..])).collect()
}

fn main() {
dbg!(one_liner("key1:value1 key2:value2 key3:value3"));
}
split_at
第二个 map 调用是从值字符串中删除前导 : 字符所必需的。

关于string - 将字符串中的键值对拆分为 HashMap,在一行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65373328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com