- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组国家,我想生成这些国家之间的关系,以便国家 A 和国家 B 之间的关系始终与国家 B 和国家 A 之间的关系相同。
例如,日本和厄瓜多尔的关系值为 15。我希望能够同时运行 get_relationship("Japan", "Ecuador");
和 get_relationship("Ecuador ", "Japan");
并且总是得到 15
。理想情况下,我不想将这个值存储两次,因为我不想费心让它保持同步。
下面是我目前的实验代码。请注意,出于不相关的原因,我将国家存储为 (name as String, Nation as struct)
的 HashMap
,主要是为了提取所需的 Nation
仅按名称的对象。
extern crate rand;
use std::collections::HashMap;
use rand::Rng;
struct Nation;
pub struct NationManager {
nations: HashMap<String, Nation>, // The string is the nation's name
rels: HashMap<String, HashMap<String, i8>>, // Again, both Strings are names
}
impl NationManager {
fn generate_relationships(&mut self) {
let mut random_rel: i8 = rand::thread_rng().gen_range(1, 101);
for (source, _) in &self.nations {
for (target, _) in &self.nations {
if source > target {
self.rels
.get(source)
.expect("ERROR")
.insert(target.clone(), random_rel);
} else if source < target {
self.rels
.get(target)
.expect("ERROR")
.insert(source.clone(), random_rel);
} else {
continue;
}
}
}
}
}
fn main() {}
我认为这不是达到预期结果的最佳方式,目前无法编译;是否真的可以像这样嵌套两个 for
循环?
error: cannot borrow immutable borrowed content as mutable
--> src/main.rs:19:21
|
19 | self.rels
| _____________________^ starting here...
20 | | .get(source)
21 | | .expect("ERROR")
| |________________________________________^ ...ending here: cannot borrow as mutable
error: cannot borrow immutable borrowed content as mutable
--> src/main.rs:24:21
|
24 | self.rels
| _____________________^ starting here...
25 | | .get(target)
26 | | .expect("ERROR")
| |________________________________________^ ...ending here: cannot borrow as mutable
最佳答案
首先:您遇到的问题是 get
返回一个不可变的引用,您尝试在其中插入
。您可能希望使用 get_mut
来获取可在其上执行 insert
的可变引用。
但是我建议更改设计:
此方案的主要优点是数字 ID 比字符串便宜/高效。
pub struct NationManager {
last_id: u32,
name_to_id: HashMap<String, u32>,
relationships: HashMap<(u32, u32), i8>, // (smaller ID, larger ID) -> score
}
查找两个国家之间的关系将涉及了解他们的 ID(在 name_to_id
中进行两次查找)然后查找关系分数。
关系
的扁平化也会极大地简化您的生成步骤:
impl NationManager {
fn generate_relationships(&mut self) {
let random_rel: i8 = rand::thread_rng().gen_range(1, 101);
for source in 0..self.last_id {
for target in (source + 1)..self.last_id {
self.relationships.insert((source, target), random_rel);
}
}
}
}
注意:实际上,域分析也可以让我们使用更小的 ID;你不应该需要超过 65,535 个国家,所以 u16
绝对足够,u8
(255 个国家)也可能足够(有 193 个国家)在联合国注册)。
关于rust - 如何将两个变量之间的双向关系存储为第三个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43470280/
我是一名优秀的程序员,十分优秀!