私は日付の差が> 10日であるスプリットを導入することにより、次の配列を分割したいですグループにシーケンシャル日付の配列:スプリット10日以上離れて
dates = [Date.parse('2017-06-26'), Date.parse('2017-07-04'), Date.parse('2017-11-30')]
#=> [Mon, 26 Jun 2017, Tue, 04 Jul 2017, Thu, 30 Nov 2017]
なるはずです次のようになります。
[[Mon, 26 Jun 2017, Tue, 04 Jul 2017], [Thu, 30 Nov 2017]]
これまでは非常に手続き的な方法がありました。これは、分割する配列、異なるグループのメンバ間の最小の差、および差を得るために評価する属性をパラメータとして受け取ります。この方法についての私のように物事が1ということです
def split_by_attribute_diff array, split_size, attribute = :itself
groups = []
current_group = []
previous = current = nil
array.sort_by(&attribute).each do |e|
previous = current
current = e
if previous && current.send(attribute) - previous.send(attribute) > split_size
if current_group.count > 0
groups << current_group
current_group = []
end
end
current_group << current
end
if current_group.count > 0
groups << current_group
end
groups
end
を(差分を決定するために使用される値がちょうど日付そのものなようにDateオブジェクトの私のアレイの場合、私は、最後のパラメータをオフのままにします) )それは動作します、2)アルゴリズムの複雑さはsort_byのものです - 配列がソートされた後、それはたった1回トラバースされます。 私が気に入らない唯一のことは、もっとシンプルになっているように見えるということです。私がここでやっていることを達成するためのRuby-ishの方法がありますか?あなたが適切にRubyで、論理テストに基づいて小さなチャンクに配列を切り分けるために、具体的な特定の
chunk_while
で
Enumerableライブラリを活用する場合
https://stackoverflow.com/questions/21024521/grouping-an-array-by-comparing-2-adjacent-elements – AbM