将数组转换为HashMap的更简单方法

问题描述 投票:0回答:1

以下代码会将数组中每种颜色的最大值转换为哈希图。也在Rust Playground

use std::collections::HashMap;
use std::cmp;

fn main() {
    let array = [
        ("blue", 1),
        ("green", 2),
        ("red", 3),
        ("blue", 4),
        ("green", 1),
        ("red", 2),
    ];
    
    let mut scores = HashMap::new();
    
    // Convert array of key value into hashmap
    array
        .into_iter()
        .for_each(|(color, color_count)| {
            // Update the HashMap
            scores
                .entry(color)
                .and_modify(|e| { *e = cmp::max(*e, color_count) })
                .or_insert(color_count);
        });

    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }
    
    println!("The product of the values: {}", scores.values().cloned().fold(1, |res, a| res * a));
}

它将得到以下打印输出:

blue: 4
green: 2
red: 3
The product of the values: 24

我面临的问题是收集的

array
来自花药
map
函数。但我面临的问题是,如果我直接将数组转换为 HashMap,HashMap 将存储最新的条目(数组的底部)。我相信有一些更简洁的方法来链接整个事物以使其看起来更整洁?预先感谢

rust
1个回答
0
投票

作为一个小改动,我建议使用 entry API,以避免一次搜索

.get()
和第二次搜索
.insert()
,但这与您自己的尝试没有太大不同。

    let mut scores = HashMap::<&str, usize>::new();
    array.iter().for_each(|(color, color_count)| {
        scores
            .entry(color)
            .and_modify(|c| *c = (*c).max(*color_count))
            .or_insert(*color_count);
    });
© www.soinside.com 2019 - 2024. All rights reserved.