相关疑难解决方法(0)

如何使用HashMap作为累加器进行折叠?

此代码有效:

let stdin = std::io::stdin();
let mut rdr = csv::Reader::from_reader(stdin);
let mut hmap = HashMap::<String, u64>::new();

rdr.records()
    .map(|r| r.unwrap())
    .fold((), |_, item| {
        // TODO: Is there a way not to have to copy item[col] every time?
        let counter = hmap.entry(item[col].to_string()).or_insert(0);
        *counter += 1;
    });
Run Code Online (Sandbox Code Playgroud)

此代码失败并显示消息:"无法移出,acc因为它是借用的"

let stdin = std::io::stdin();
let mut rdr = csv::Reader::from_reader(stdin);
let hmap = rdr.records()
    .map(|r| r.unwrap())
    .fold(HashMap::<String, u64>::new(), |mut acc, item| {
        // TODO: Is there a way not to have to copy …
Run Code Online (Sandbox Code Playgroud)

rust

10
推荐指数
1
解决办法
1972
查看次数

构建字符计数的 HashMap 的惯用 Rust 方法是什么?

我想计算字符串中每个字母的出现次数。目标是建立一个HashMap<char,i32>键是字符串中的所有字符而值是出现次数的地方。

假设我正在遍历char字符串或输入文件中的值。对于 each char,如果还没有遇到过,我需要将它HashMap作为一个值为 1 的新键添加到 中,但是如果之前已经看到过,我需要增加该值。

这是有效的代码。请耐心等待,我对 Rust 很陌生:

use std::collections::HashMap;

fn main() {
    let mut letter_counts: HashMap<char,i32> = HashMap::new();

    let input_string = "Hello, world!";
    let char_vec: Vec<char> = input_string.to_lowercase().chars().collect();
    for c in char_vec {
        if let Some(x) = letter_counts.get_mut(&c) {
            *x = *x + 1;
        } else {
            letter_counts.insert(c,1);
        }
    }
    println!("{:?}",letter_counts);
}
Run Code Online (Sandbox Code Playgroud)

我想知道的是,在 Rust 中是否有一种惯用的方法来做到这一点?通过惯用语,我的意思是有一个标准库类型(如 Python 的defaultdict),或 HashMap 上的一个方法(如 Java 的HashMap.computeIfAbsent),可以使这个更简单,更清晰,和/或比我所做的手动编码算法更不容易出错?

collections hashmap rust

1
推荐指数
1
解决办法
818
查看次数

标签 统计

rust ×2

collections ×1

hashmap ×1