You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:20:11