首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在自身之上迭代hashmap的元素,并使它们是可变的?

如何在自身之上迭代hashmap的元素,并使它们是可变的?
EN

Stack Overflow用户
提问于 2021-12-12 11:40:32
回答 1查看 428关注 0票数 2

因此,我有一个hashmap,它使用字符串作为键,并且值是我自己的用户结构。这只是他们的名字和位置

代码语言:javascript
复制
pub struct User {
    name: String,
    x: i32,
    y: i32
}

现在我要做的是迭代名为users的hashmap,看看两个用户的位置是否接近,然后将它们分开。

代码语言:javascript
复制
for (key, userA) in self.users.iter_mut() {
    for (key, userB) in self.users.iter_mut() {
        // collision code would go in here
    }
}

这会导致一个问题,因为用户的借入量是可变的两倍。我想通过互斥来解决这个问题,

代码语言:javascript
复制
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
    }
}

代码会编译,但当我因为第二个循环而将一个用户添加到映射中时,它会导致运行时错误,因为如果我注释掉该循环,代码就没有问题地运行。我有什么不同的想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-12 23:49:44

你可以分两个阶段来做。首先收集碰撞,然后解决它们。例如:

代码语言:javascript
复制
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.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70323202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档