因此,我有一个hashmap,它使用字符串作为键,并且值是我自己的用户结构。这只是他们的名字和位置
pub struct User {
name: String,
x: i32,
y: i32
}现在我要做的是迭代名为users的hashmap,看看两个用户的位置是否接近,然后将它们分开。
for (key, userA) in self.users.iter_mut() {
for (key, userB) in self.users.iter_mut() {
// collision code would go in here
}
}这会导致一个问题,因为用户的借入量是可变的两倍。我想通过互斥来解决这个问题,
for (key, userA) in self.users.lock().unwrap().iter_mut() {
for (key, userB) in self.users.lock().unwrap().iter_mut() {
// collision code would go in here
}
}代码会编译,但当我因为第二个循环而将一个用户添加到映射中时,它会导致运行时错误,因为如果我注释掉该循环,代码就没有问题地运行。我有什么不同的想法吗?
发布于 2021-12-12 23:49:44
你可以分两个阶段来做。首先收集碰撞,然后解决它们。例如:
let mut collisions = Vec::new();
for (key_a, user_a) in self.users.iter() {
for (key_b, user_b) in self.users.iter() {
if key_a == key_b {
continue;
}
if user_a.x == user_b.x && user_a.y == user_b.y {
collisions.push((key_a, key_b));
}
}
}
for (key_a, key_b) in collisions {
// Move users apart.
}https://stackoverflow.com/questions/70323202
复制相似问题