在一行中将键值对字符串转换为 HashMap
Convert key value pair string to HashMap in one line
我有一个字符串,内容如下:
key1:value1 key2:value2 key3:value3 ...
我想以 HashMap<&str, &str>
(或等价物)结束,它映射字符串中的键和值(例如,“key1”的散列查找应该 return“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 find
and split_at
方法设法做到了:
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"));
}
第二个 map
调用是从值字符串中删除前导 :
字符所必需的。
我有一个字符串,内容如下:
key1:value1 key2:value2 key3:value3 ...
我想以 HashMap<&str, &str>
(或等价物)结束,它映射字符串中的键和值(例如,“key1”的散列查找应该 return“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 find
and split_at
方法设法做到了:
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"));
}
第二个 map
调用是从值字符串中删除前导 :
字符所必需的。