如何将 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);
}

使用itertools's tuples:

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,
}

Playground