过滤HashMap时出现无限循环问题求助
同一X/Z坐标下体素最底部判断方案
问题核心
你需要判断当前体素是否是同一X、Z坐标下,HashMap中存储的y值最小的体素(即该位置实际存在的最底部体素),之前的无限循环大概率是因为未消耗迭代器就重复使用,或是循环逻辑有误。
修正后的实现
首先修正你代码中的拼写错误(filterd → filtered),然后通过以下步骤实现目标:
方式1:先收集再判断(直观易懂)
// 过滤出同一X、Z的所有体素位置并收集到Vec中 let filtered_voxels: Vec<&Position> = voxel_array .keys() .filter(|pos| pos.x == voxel.0.x && pos.z == voxel.0.z) .collect(); // 找到这些位置中y值最小的体素 if let Some(min_y_pos) = filtered_voxels.iter().min_by_key(|&&pos| pos.y) { // 判断当前体素是否为最底部 let is_bottom_voxel = voxel.0.y == min_y_pos.y; // 执行后续逻辑 }
方式2:直接迭代找最小值(更高效,避免Vec分配)
不需要提前收集所有元素,直接在迭代器上计算最小值,性能更优:
let is_bottom_voxel = voxel_array .keys() .filter(|pos| pos.x == voxel.0.x && pos.z == voxel.0.z) .min_by_key(|pos| pos.y) // 当前体素必然在HashMap中,所以unwrap也安全,或用unwrap_or(false)兜底 .map(|min_pos| min_pos.y == voxel.0.y) .unwrap_or(false);
无限循环原因分析
你之前不用collect()时出现无限循环,通常是因为:
- 迭代器未被完全消耗就重复遍历,或是在循环中修改了
voxel_array(如插入/删除元素),导致迭代器行为异常; - 循环条件未正确终止(比如错误的循环判断逻辑)。
用collect()将迭代器转换为Vec后,所有元素被提前固定,不会受后续HashMap修改影响,也能避免迭代器重复遍历的问题。
内容的提问来源于stack exchange,提问作者NewUser69420
相关产品推荐
相关产品推荐

