如何将 Vec<T> 转换为 HashMap<T,T>?
How to convert Vec<T> to HashMap<T,T>?
我有一个向量 strings.I 需要将其转换为 HashMap。
Vector 的 0 个元素应成为键,1 个元素应成为值。 2、3 等也是如此。
显而易见的解决方案,只是做一个for循环并将它们一个一个地添加到HashMap中。但是,它最终会变成几行代码。很好奇有没有更干净的one-liner
我知道你可以 vec.to_iter().collect()。但是,这需要向量具有元组(相对于平面向量)。
您可以使用 chunks_exact
加上一些组合器来实现此目的。但是,出于可读性原因,我不建议将其仅放在一行中。这确实有一个缺点,那就是多余的元素(如果向量有奇数个元素)将被丢弃。
use std::collections::HashMap;
fn main() {
// vector with elements
let vector = vec!["a", "b", "c", "d", "e", "f"];
let map = vector.chunks_exact(2) // chunks_exact returns an iterator of slices
.map(|chunk| (chunk[0], chunk[1])) // map slices to tuples
.collect::<HashMap<_, _>>(); // collect into a hashmap
// outputs: Map {"e": "f", "c": "d", "a": "b"}
println!("Map {:?}", map);
}
use itertools::Itertools;
use std::collections::HashMap;
fn main() {
let v: Vec<String> = vec!["key1".into(), "val1".into(), "key2".into(), "val2".into()];
// Extra elements are discarded
let hm: HashMap<String, String> = v.into_iter().tuples().collect();
assert_eq!(hm, HashMap::from([("key1".into(), "val1".into()), ("key2".into(), "val2".into())]));
}
slice::array_chunks
目前不稳定,但当它在未来稳定下来时,我更喜欢这个而不是 .chunks(2)
:
#![feature(array_chunks)]
use std::collections::HashMap;
fn main() {
let vec = vec![1, 2, 3, 4, 5, 6, 7];
let map = vec
.array_chunks::<2>()
.map(|[k, v]| (k, v))
.collect::<HashMap<_, _>>();
dbg!(map);
}
输出:
[src/main.rs:11] map = {
1: 2,
3: 4,
5: 6,
}
我有一个向量 strings.I 需要将其转换为 HashMap。
Vector 的 0 个元素应成为键,1 个元素应成为值。 2、3 等也是如此。
显而易见的解决方案,只是做一个for循环并将它们一个一个地添加到HashMap中。但是,它最终会变成几行代码。很好奇有没有更干净的one-liner
我知道你可以 vec.to_iter().collect()。但是,这需要向量具有元组(相对于平面向量)。
您可以使用 chunks_exact
加上一些组合器来实现此目的。但是,出于可读性原因,我不建议将其仅放在一行中。这确实有一个缺点,那就是多余的元素(如果向量有奇数个元素)将被丢弃。
use std::collections::HashMap;
fn main() {
// vector with elements
let vector = vec!["a", "b", "c", "d", "e", "f"];
let map = vector.chunks_exact(2) // chunks_exact returns an iterator of slices
.map(|chunk| (chunk[0], chunk[1])) // map slices to tuples
.collect::<HashMap<_, _>>(); // collect into a hashmap
// outputs: Map {"e": "f", "c": "d", "a": "b"}
println!("Map {:?}", map);
}
use itertools::Itertools;
use std::collections::HashMap;
fn main() {
let v: Vec<String> = vec!["key1".into(), "val1".into(), "key2".into(), "val2".into()];
// Extra elements are discarded
let hm: HashMap<String, String> = v.into_iter().tuples().collect();
assert_eq!(hm, HashMap::from([("key1".into(), "val1".into()), ("key2".into(), "val2".into())]));
}
slice::array_chunks
目前不稳定,但当它在未来稳定下来时,我更喜欢这个而不是 .chunks(2)
:
#![feature(array_chunks)]
use std::collections::HashMap;
fn main() {
let vec = vec![1, 2, 3, 4, 5, 6, 7];
let map = vec
.array_chunks::<2>()
.map(|[k, v]| (k, v))
.collect::<HashMap<_, _>>();
dbg!(map);
}
输出:
[src/main.rs:11] map = {
1: 2,
3: 4,
5: 6,
}