Je tire un ensemble de données à partir d'une base de données qui me donne un vecteur de struct de la forme:Transformer une liste de struct avec ID parent dans une liste des arbres
struct Foo {
id: i32,
parent: Option<i32>,
data: String,
}
Je voudrais sérialisation et la sortie JSON la version imbriquée de ces données comme vecteur de:
struct Bar {
id: i32,
data: String,
children: Option<Vec<Bar>>,
}
Je vais avoir des problèmes d'emballage ma tête autour de la mise en œuvre de ce en raison de la nature récurrente. Je peux résoudre le problème d'un niveau à l'aide d'itérateurs, mais ensuite frapper un mur quand je veux recommencer à itérer sur le même vecteur.
Par exemple, une méthode sur Vec<Foo>
qui tente de ids seulement les enfants de nid dans un hashmap:
fn build_tree(&self) -> HashMap<i32, Vec<i32>> {
let mut tree = HashMap::new();
for node in self.iter() {
if let Some(parent) = node.parent {
let leaf = tree.entry(parent).or_insert(Vec::new());
leaf.push(node.id);
}
}
tree
}
cède
{14: [15], 3: [14], 1: [2, 17], 2: [16, 18], 18: [19], 19: [20]}
Mais ce que je demande serait quelque chose de plus profond:
{3: [14: [15]], 1: [2: [16, 18: [19: [20]]], 17]}
Lecture à travers this post sur la transformation d'un récursif L'idée en code itératif suggère qu'une telle implémentation est possible, mais j'ai eu du mal à prendre les idées de ce problème et à les appliquer ici. Est-ce que quelqu'un peut décrire une méthode pour transformer ce Vec<Foo>
en Vec<Bar>
? Je serais heureux avec une suggestion itérative ou récursive; J'ai juste eu beaucoup de problèmes avec les emprunts et le référencement quand j'ai essayé la récursivité moi-même.
@trentcl: Je serais heureux avec une suggestion récursive aussi, j'ai juste eu beaucoup de problèmes avec les emprunts et le référencement quand j'ai essayé cette route moi-même. – Geodesic