Ruby中如何统计数组元素的range_id并根据计数执行对应逻辑?
Ruby中如何统计数组元素的range_id并根据计数执行对应逻辑?
嘿,我来帮你搞定这个需求~你想要统计数组里每个range_id的出现次数,只对出现次数≤3的那些range_id对应的元素执行任务,对吧?其实用Ruby的数组方法就能轻松实现,我给你一步步拆解:
第一步:先统计每个range_id的出现次数
首先我们可以用group_by把数组按range_id分组,再用transform_values(&:count)把每个分组转换成对应的元素数量,这样就能得到每个range_id的出现次数了:
result = [ {"range_id": 18, "id": 1, "start": 1863, "end": 1875}, {"range_id": 12, "id": 2, "start": 1820, "end": 1844}, {"range_id": 19, "id": 3, "start": 1875, "end": 1887}, {"range_id": 12, "id": 4, "start": 1844, "end": 1856}, {"range_id": 18, "id": 5, "start": 1887, "end": 1899}, {"range_id": 12, "id": 6, "start": 1856, "end": 1868} ] # 统计每个range_id的出现次数 range_counts = result.group_by { |item| item[:range_id] }.transform_values(&:count) # 这时候range_counts会是 {18=>2, 12=>3, 19=>1}
第二步:根据计数筛选并执行任务
接下来就可以根据这个统计结果,选择要处理的range_id了。这里分两种常见场景:
场景1:对符合条件的range_id的所有元素批量处理
如果你想把同一个range_id的元素放在一起处理,比如批量打印或者批量更新,可以这样写:
range_counts.each do |range_id, count| # 跳过出现次数超过3的range_id next unless count <= 3 # 获取当前range_id对应的所有元素 target_items = result.select { |item| item[:range_id] == range_id } # 在这里写你的任务逻辑,比如打印信息 puts "开始处理range_id=#{range_id}的元素(共#{count}个):" target_items.each do |item| puts " 元素id:#{item[:id]},时间段:#{item[:start]}-#{item[:end]}" end end
场景2:逐个处理符合条件的元素
如果你想遍历数组里的每个元素,只处理所属range_id计数≤3的元素,可以这样:
range_counts = result.group_by { |item| item[:range_id] }.transform_values(&:count) result.each do |item| current_range_id = item[:range_id] # 跳过所属range_id次数超3的元素 next unless range_counts[current_range_id] <= 3 # 这里写单个元素的处理逻辑 puts "处理元素:id=#{item[:id]},range_id=#{current_range_id}" end
小提示
你原来写的result.range_id.count是不对的哦,因为result是数组,没有range_id这个方法,必须先通过分组统计每个range_id的次数才行~
备注:内容来源于stack exchange,提问作者Rubin
相关产品推荐
相关产品推荐

