Как сгруппировать векторный ключ - PullRequest
0 голосов
/ 09 июня 2019

Я хочу сгруппировать вектор по ключу, когда ключ является вектором.

struct Document {
    categories: Vec<String>,
    body: String
}


let docs = vec![Document {categories: ["rust".to_string(), body: "doc1".to_string()]},
Document {categories: ["clojure".to_string()], body: "doc2".to_string()},
Document {categories: ["java".to_string()], body: "doc3".to_string()},
Document {categories: ["rust".to_string(), "clojure".to_string], body: "doc4".to_string()}];

Я хочу вернуться, как показано ниже (category_key, documents)

"rust" => [doc1, doc4]  
"clojure" => [doc2, doc4]  
"java" => [doc3]

1 Ответ

2 голосов
/ 09 июня 2019

Я новичок в Rust, и для меня это был вызов

use std::collections::HashMap;

let result = docs.iter().fold(
    HashMap::new(),
    |mut init: HashMap<String, Vec<String>>, ref item| {
        for category in &item.categories {
            let item_body = item.body.clone();

            let new_vector: Vec<String> = init
                .remove(category)
                .map(|mut val| {
                    val.push(item_body.clone());
                    val
                })
                .unwrap_or(vec![item_body.clone()])
                .to_vec();
            init.insert(category.clone(), new_vector);
        }

        init
    },
);

Я уверен, что этот код можно упростить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...