我定义了以下散列映射:
let mut adj_list: HashMap<String, Vec<String>>;
let mut adj_matrix: HashMap<String, Vec<(String, bool)>> = HashMap::new();我还有一个循环:
for (src, _neighbors) in self.adj_list.iter() {
for (dest, _n) in self.adj_list.iter(){
let d: &mut (String, bool) = adj_matrix.get_mut(src)
.into_iter()
.find(|&x| x == dest) // Error here
.unwrap();
// Do something with the tuple d
}
}我得到的错误是:
adj_matrix.get_mut(src).into_iter().find(|&x| x == dest);
^^ no implementation for `Vec<(String, bool)> == String`这对我来说是有意义的,直接将字符串与元组进行比较是没有意义的。但是,我很难弄清楚如何将dest字符串与元组的第一个元素进行比较。
我试过:
adj_matrix.get_mut(src).into_iter().find(|&x| x.1 == dest);但这给了我一个错误:
adj_matrix.get_mut(src).into_iter().find(|&x| x.1 == dest);
^ unknown field处理这件事的正确方法是什么?
发布于 2022-09-04 19:08:57
您的adj_matrix变量是向量的HashMap。
你得到的错误给了你一个提示:
^^
Vec<(String, bool)> == String不实现
您不是将元组与字符串进行比较,而是将元组的Vec与字符串进行比较,这也是没有意义的。
为什么你在这里有一个Vec,而它看起来你应该有一个元组?
让我们看看这里的类型:
let d: &mut (String, bool) = adj_matrix.get_mut(src) // --> Option<&mut Vec<(String, bool)>>
.into_iter() // --> impl Iterator<Item = &mut Vec<(String, bool)>>
.find(|&x| x == dest) // x -> Vec<(String, bool)>
.unwrap();这是因为Option确实实现了IntoIter,并返回返回0或1元素的迭代器,这取决于它是Some()还是None。
要解决您的问题,首先需要确保您确实有一个src键的条目。
它看起来像这样:
for (src, _neighbors) in self.adj_list.iter() {
for (dest, _n) in self.adj_list.iter(){
if let Some(v) = adj_matrix.get_mut(src) {
let d: &mut (String, bool) = v
.into_iter()
.find(|&x| x == dest)
.unwrap();
// Do something with the tuple d
} else {
// src was not found
}
}
}https://stackoverflow.com/questions/73601832
复制相似问题