首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将3元组列表(Iterator<Item = (K0,K1,V)>)转换为映射(HashMap<K0,HashMap<K1,V>>)的映射?

如何将3元组列表(Iterator<Item = (K0,K1,V)>)转换为映射(HashMap<K0,HashMap<K1,V>>)的映射?
EN

Stack Overflow用户
提问于 2021-10-22 11:55:44
回答 4查看 96关注 0票数 0

上面的标题应该足以解释这个问题,如果不是,那么下面的代码片段就足够了。

代码语言:javascript
复制
fn transform<K0, K1, V, I>(input: I) -> HashMap<K0, HashMap<K1, V>>
where
  K0: Hash + Eq,
  K1: Hash + Eq,
  I: IntoIterator<Item = (K0, K1, V)>,
{
  // what is the most elegant (preferably functional) way to do this?
}
EN

回答 4

Stack Overflow用户

发布于 2021-10-22 12:23:56

一种“函数式”的方法就是使用fold。但我更喜欢显式循环。

代码语言:javascript
复制
fn transform2<K0, K1, V, I>(input: I) -> HashMap<K0, HashMap<K1, V>>
where
    K0: Hash + Eq,
    K1: Hash + Eq,
    I: IntoIterator<Item = (K0, K1, V)>,
{
    input
        .into_iter()
        .fold(HashMap::new(), |mut h, (k0, k1, v)| {
            h.entry(k0).or_default().insert(k1, v);
            h
        })
}
票数 3
EN

Stack Overflow用户

发布于 2021-10-22 12:22:33

在这种情况下,一个简单的循环就可以了:

代码语言:javascript
复制
use std::collections::HashMap;
use std::hash::Hash;

fn transform<K0, K1, V, I>(input: I) -> HashMap<K0, HashMap<K1, V>>
where
  K0: Hash + Eq,
  K1: Hash + Eq,
  I: IntoIterator<Item = (K0, K1, V)>,
{
    let mut result_map = HashMap::new();
    for (k0, k1, v) in input {
        result_map.entry(k0).or_insert_with(HashMap::new).insert(k1, v);
    }
    result_map
}

Playground

票数 2
EN

Stack Overflow用户

发布于 2021-10-22 12:22:02

来自Rust论坛的用户Hyeonu提供了一个很好的答案(link):

代码语言:javascript
复制
fn transform<K0, K1, V, I>(input: I) -> HashMap<K0, HashMap<K1, V>>
where
  K0: Hash + Eq,
  K1: Hash + Eq,
  I: IntoIterator<Item = (K0, K1, V)>,
{
    let mut m = HashMap::<K0, HashMap<K1, V>>::new();
    for (k0, k1, v) in input {
        m.entry(k0).or_default().insert(k1, v);
    }
    m
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69676476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档