ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

Rust で Vector データを Map + Vector にいれる

どんな状況だったかというと、JSON で設定ファイルを書く必要があってそれが複数人にいじられるという感じで、マージで地獄を見たのでまずは TSV でどうにかしてみよう、となったときに書いたやつです。*1
ほんと JSON はマージしづらくてかなわん。

そして、ある要素をキーにまとめていくんですが、その配下が複数になりえる設定でした。というか、大体複数でした。
ということは、Vector から Map にしつつその中に Vector があって、ということになります。

で、こんな感じ。

use std::collections::HashMap;

#[derive(Debug)]
struct Hoge {
    a: String,
    b: u32,
}

fn main() {
    let xs = vec![
        Hoge {a: "a".to_owned(), b: 1},
        Hoge {a: "aaa".to_owned(), b: 2},
        Hoge {a: "a".to_owned(), b: 3},
        Hoge {a: "aaa".to_owned(), b: 4},
        Hoge {a: "aa".to_owned(), b: 5},
    ];

    let h = xs.into_iter().fold(HashMap::<String, Vec<u32>>::new(), |mut acc, x| {
        acc.entry(x.a).or_insert(Vec::new()).push(x.b);
        acc 
    });

    println!("{:?}", h);
}

https://play.rust-lang.org/?gist=75d175041fcd5577b2c9ea0d7fb95594&version=stable

一番の発見は or_insert で、こいつのおかげで大分まとまりました。
mut とかの話、はいいや。どっかで誰かが書いてそうです。

*1:本質的な解決になってなかったので動かしてないですが…