gpt4 book ai didi

rust - 从从 JSON 加载的 Vec<(String, String)> 创建 Petgraph 图

转载 作者:行者123 更新时间:2023-11-29 08:04:57 28 4
gpt4 key购买 nike

我正在尝试创建宠物图 Graph 来自 JSON 数据。 JSON 包含图的边,键表示起始顶点,值是相邻顶点的列表。有可能 generate a graph with a vector of edges .

我设法创建了一个 Vec<(String, String))>但不是 Vec<(&str, &str)>正如预期的那样。

extern crate petgraph;
extern crate serde_json;

use petgraph::prelude::*;
use serde_json::{Value, Error};

fn main() {
let data = r#"{
"A": [ "B" ],
"B": [ "C", "D" ],
"D": [ "E", "F" ]
}"#;
let json_value: Value = serde_json::from_str(data).unwrap();
let mut edges: Vec<(String, String)> = vec![];
if let Value::Object(map) = json_value {
for (from_edge, array) in &map {
if let &Value::Array(ref array_value) = array {
for edge in array_value {
if let &Value::String(ref to_edge) = edge {
edges.push((from_edge.clone(), to_edge.clone()))
}
}
}
}
}
// let graph = DiGraphMap::<&str, ()>::from_edges(edges);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct
// `std::string::String`, found &str

}

我尝试了不同的东西:

  • 将图表类型更改为 DiGraphMap::<String, ()> , 但是它不接受它。
  • 转换 Vec<(String, String)>进入 Vec<(&str, &str)> .我读了this post但这没有帮助。
  • edges.push((&"a", &"b"))有效但无效 edges.push((&from.clone(), &to.clone())) .

这里可能有更好的方法来提取边缘。

最佳答案

Change the graph type to DiGraphMap::<String, ()>, however it does not accept it.

A GraphMap要求节点类型是可复制的。 String不执行 Copy .

Transform a Vec<(String, String)> into a Vec<(&str, &str)>

如您链接的问题中所述,这是不可能的。您可以做的是创建一个第二个 Vec&str引用原文 String小号:

let a: Vec<(String, String)> = vec![("a".into(), "b".into())];

let b: Vec<(&str, &str)> = a.iter()
.map(|&(ref x, ref y)| (x.as_str(), y.as_str()))
.collect();

但是,在这种情况下不需要这样做。相反,将 JSON 数据读入建模 map 的数据结构(我选择了 BTreeMap )并保留 String在那里。然后,您可以构建对那些 String 的引用对的迭代器。 s,从中构建图表:

extern crate petgraph;
extern crate serde_json;

use petgraph::prelude::*;
use std::collections::BTreeMap;
use std::iter;

fn main() {
let data = r#"{
"A": [ "B" ],
"B": [ "C", "D" ],
"D": [ "E", "F" ]
}"#;

let json_value: BTreeMap<String, Vec<String>> =
serde_json::from_str(data).unwrap();

let edges = json_value
.iter()
.flat_map(|(k, vs)| {
let vs = vs.iter().map(|v| v.as_str());
iter::repeat(k.as_str()).zip(vs)
});

let graph: DiGraphMap<_, ()> = edges.collect();
}

I need to encapsulate this into a function

几乎不可能做到。由于 JSON 字符串包含 UTF-8 数据,Serde 允许您获取对原始输入字符串的引用。你需要记住你的 graph 不能超过input :

fn main() {
let data = r#"{
"A": [ "B" ],
"B": [ "C", "D" ],
"D": [ "E", "F" ]
}"#;

let graph = example(data);
}

fn example(data: &str) -> serde_json::Result<DiGraphMap<&str, ()>> {
let json_value: BTreeMap<&str, Vec<&str>> = serde_json::from_str(data)?;

let edges = json_value
.into_iter()
.flat_map(|(k, vs)| iter::repeat(k).zip(vs));

Ok(edges.collect())
}

关于rust - 从从 JSON 加载的 Vec<(String, String)> 创建 Petgraph 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087693/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com