如何在Ruby中计算数组中的元素

mbyulnm0  于 2023-03-08  发布在  Ruby
关注(0)|答案(2)|浏览(159)
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,
  }
]

我喜欢做的是检查result中的“range_id”值,并计算相同的range_id,如果range_id.count〈= 3,我执行某些任务,否则跳过,但不确定如何实现。我们可以在ruby中做如下操作吗:

next unless result.range_id.count <=3
{
do something
}
6pp0gazn

6pp0gazn1#

您可以使用以下一行程序来计算每个range_id出现的次数:

result.map { |hash| hash[:range_id] }.tally
#=> { 18 => 2, 12 => 3, 19 => 1 }

然后,您可以迭代该散列,并根据其计数处理每个range_id

range_id_counters = result.map { |hash| hash[:range_id] }.tally
range_id_counters.each do |range_id, count|
  puts("#{range_id} occurs only #{count} times") if count <= 3
end
# 18 occurs only 2 times
# 12 occurs only 3 times                                                                                                                         
# 19 occurs only 1 times
jvidinwx

jvidinwx2#

这里还有几个选择
1.您可以使用嵌套选择来获取具有3个或更少值的记录

selection_of_items = result.select do |a|
    result.select { |b| b[:'range_id'] == a[:'range_id']}.size <= 3
end

selection_of_items.each do |c|
  # do something
end

1.你可以避免上面的O(n^2),而不是使用一个数组来存储项目,你可以尝试一个哈希来代替使用范围_id作为键,和一个'Set'来存储具有相同范围_id的项目,例如{“18”=〉{{“range_id”=〉18,“id”=〉1,“start”=〉1863,“end”=〉1875},...},...}

# using your result array from above
hash_result = {}
result.each do |obj|
  hash_result.store(
    obj[:'range_id'], hash_result.fetch(obj[:'range_id'], Set.new).add(obj)
  )
end
# then use the new structure
# {
#   18=>{{:range_id=>18, :id=>1, :start=>1863, :end=>1875}, {:range_id=>18, :id=>5, :start=>1887, :end=>1899}},
#   12=>{{:range_id=>12, :id=>2, :start=>1820, :end=>1844},{:range_id=>12, :id=>4, :start=>1844, :end=>1856},
#     {:range_id=>12, :id=>6, :start=>1856, :end=>1868}},
#   19=>{{:range_id=>19, :id=>3, :start=>1875, :end=>1887}}
# }
hash_result.each do |k,v|
  next if v.count > 3
  v.each do |d|
     #do something
  end 
end

相关问题