gpt4 book ai didi

rust - 如何将两个变量之间的双向关系存储为第三个变量?

转载 作者:行者123 更新时间:2023-11-29 08:22:25 24 4
gpt4 key购买 nike

我有一组国家,我想生成这些国家之间的关系,以便国家 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 的可变引用。


但是我建议更改设计:

  1. 存储 map 名称 -> ID,
  2. 在其他 map 中使用 ID 作为键。

此方案的主要优点是数字 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/

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