【问题标题】:Slicing arrays based on relations in the data (in Ruby)根据数据中的关系对数组进行切片(在 Ruby 中)
【发布时间】:2015-09-05 03:36:06
【问题描述】:

我有这种形式的数组:[1, 2, 1, 4, 5, 4, 1, 7, 7, 6],我需要将它们切成 [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]] 之类的东西,其中间断由大于 1 的连续对之间的绝对差决定。

Ruby 中是否有一些我可以利用的魔力,还是我不得不编写一个普通的旧迭代?

【问题讨论】:

  • @Stefan 有一个很好的答案,但为什么要急于做出选择呢?为什么不给其他人一些时间(他们现在正在研究答案)提出其他建议。顺便说一句,slice_when(也许是slice_after)是相当新的(我相信Ruby 2.2)。
  • Stefan 的回答有效并指向正确的文档 (2.2.2),这就是接受此类问题的答案所需的全部内容。版本点是没有实际意义的:如果有人没有使用该特定版本并且有一个可行的替代解决方案,欢迎他们发布它,读者将受益于这些,以及 Stefan 的。至于什么是“最佳”答案,我们可以整天争论不休,但我相信没有唯一的标准来确定“最佳”。
  • 如果我发布了这个问题,我也会选择@Stefan 的答案,但我至少要等几个小时才能这样做。至于slice_when 何时可用,我只是通知您和其他可能不熟悉新方法的读者。我只是不喜欢快速绘制的选择。他们可以阻止其他,有时更好,有时发人深省的答案,并且(imo)对那些仍在准备答案的人不礼貌。 (当我开始准备我的答案时,绿党已经起来了。)

标签: arrays ruby slice chunks


【解决方案1】:

你可以使用Enumerable#slice_when:

a = [1, 2, 1, 4, 5, 4, 1, 7, 7, 6]
a.slice_when { |i, j| (i - j).abs > 1 }.to_a
#=> [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]]

【讨论】:

  • 耶!我知道有事 :) (我会在 8 分钟内接受你的回答 :)
【解决方案2】:

以下内容适用于 Ruby v1.9+:

arr = [1, 2, 1, 4, 5, 4, 1, 7, 7, 6]

arr[1..-1].each_with_object([[arr.first]]) do |e,a|
  ((a.last.last-e).abs > 1) ? a << [e] : a[-1] << e
end
  #=> [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]] 

如果需要支持早期版本,可以使用reduce而不是each_with_object

【讨论】:

  • 你将如何使用 reduce,确切地说?
  • @Morpheu5 arr[1..-1].reduce([[arr.first]]) do |a,e| ; ((a.last.last-e).abs &gt; 1) ? a &lt;&lt; [e] : a[-1] &lt;&lt; e ; a ; end.
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 2020-12-26
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2020-06-08
相关资源
最近更新 更多