[[9am-3pm,15,21,0],[3pm-9pm,21,23,1],[3pm-9pm,0,3,1],[9pm-3am,3,9,1]]
我有这样的数组,可以在视图上显示结果
9am-3pm 0
3pm-9pm 1
3pm-9pm 1
9pm-3am 1
我希望结果看起来像这样:
9am-3pm 0
3pm-9pm 2
9pm-3am 1
即3 pm-9pm很常见,因此将其添加并合并为一个。
任何优化解决方案?
由于您到目前为止还没有显示您所做的任何事情,因此实际上没有优化可以提供给您。
对于预期的输出,您可以将数组按第一个元素分组,然后将结果映射到一个数组数组,其中第一个元素是时间范围(“ Wxm-Yzm”),第二个元素是以下各项的总和它们的最后一个元素(0,1,1,1)对应:
p [['9am-3pm',15,21,0],['3pm-9pm',21,23,1],['3pm-9pm',0,3,1],['9pm-3am',3,9,1]].group_by(&:first).map { |key, value| [key, value.sum(&:last)] }
# [["9am-3pm", 0], ["3pm-9pm", 2], ["9pm-3am", 1]]
arr = [['9am-3pm',15,21,0],['3pm-9pm',21,23,1],
['3pm-9pm',0,3,1],['9pm-3am',3,9,1]]
h = arr.each_with_object(Hash.new(0)) { |(period,*),h| h[period] += 1 }
#=> {"9am-3pm"=>1, "3pm-9pm"=>2, "9pm-3am"=>1}
您可能只想将其保留为哈希,但是如果您要显示问题中的数组:
h.to_a
#=> [["9am-3pm", 1], ["3pm-9pm", 2], ["9pm-3am", 1]]
请参阅带有自变量的Hash::new形式,称为默认值。有时称为counting hash。
。Ruby的解析器将表达式h[k] += 1
扩展为
h[k] = h[k] + 1
评估之前。如果h
没有键k
,则此表达式变为
h[k] = 0 + 1
因为等式右边的h[k]
返回默认值零。 h
具有键k
后,等式右侧的h[k]
会简单地返回k
的值。
[您是否想知道为什么当h[k]
没有键h
时,等式右边的k
会返回默认值,请记住表达式h[k] = h[k] + 1
是简写的
h.[]=(k, h.[](k) + 1)