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:本質的な解決になってなかったので動かしてないですが…