如何检测二维数组的首个元素中是否存在指定值
二维数组子数组首元素检测与添加实现
你要实现的逻辑是:检查二维数组中是否存在首元素等于目标id的子数组,若不存在则将[id, 1]追加到数组中。之前一维数组的代码无法直接复用,因为二维数组的元素是子数组,直接调用include?会对比整个子数组,而非子数组的首个元素。
这里提供两种实用的实现方式:
方式一:直接遍历检测(适合小规模数组)
# 初始化示例二维数组 target_arr = [[2,5],[3,1],[4,1]] check_id = 5 # 待测id # 检测并添加 unless target_arr.any? { |sub| sub.first == check_id } target_arr << [check_id, 1] end
any?方法会遍历数组中的每个子数组,判断其首元素是否等于目标id。只要存在匹配项,就跳过追加操作;反之则将[check_id, 1]加入数组。
方式二:预存首元素集合(适合大规模数组)
如果需要频繁执行这类检测,先提取所有子数组的首元素存入集合,能大幅提升查询效率:
target_arr = [[2,5],[3,1],[4,1]] check_id = 2 # 提取所有子数组首元素到集合 existing_ids = target_arr.map(&:first).to_set unless existing_ids.include?(check_id) target_arr << [check_id, 1] end
map(&:first)会提取所有子数组的首个元素,转成Set后,include?的查询时间复杂度为O(1),比遍历数组的O(n)更高效。
为什么原一维数组代码不适用?
一维数组[:cart]的元素是单个值,include?(id)直接判断值是否存在;但二维数组的元素是子数组,原逻辑会尝试用include?(id)对比整个子数组与id,显然永远不匹配,导致每次都会执行追加操作,这就是问题所在。
内容的提问来源于stack exchange,提问作者Tikroz
相关产品推荐
相关产品推荐

