我想根據值的接近性和值之間的給定間隔將值分組到一個數組中。的5例如Group_by similar values - Ruby
a=[1,2,5,7,20,25,50,53]
間隔:
a=[[1,2,5,7],[20,25],[50,53]]
如果我改變的時間間隔爲2:
a=[[1,2],[5,7],[20],[25],[50],[53]]
伊夫嘗試這種使用group_by
但是沒有成功解決。
感謝
我想根據值的接近性和值之間的給定間隔將值分組到一個數組中。的5例如Group_by similar values - Ruby
a=[1,2,5,7,20,25,50,53]
間隔:
a=[[1,2,5,7],[20,25],[50,53]]
如果我改變的時間間隔爲2:
a=[[1,2],[5,7],[20],[25],[50],[53]]
伊夫嘗試這種使用group_by
但是沒有成功解決。
感謝
我認爲這將做的工作,即使有可能是一個更好的解決方案(如總是Ruby
):
def group array, diff
array.sort! # To remove if you're sure your array will always be sorted
# array = array.sort # could be a better solution if you don't want your array to be modified in place
res = []
subres = []
array.each do |elt|
if subres.count == 0 || elt - subres.last <= diff
subres << elt
else
res << subres
subres = [elt]
end
end
res << subres unless subres.empty?
res
end
a = [1, 2, 5, 7, 20, 25, 50, 53]
p group a, 5
p group a, 2
將輸出
[[1, 2, 5, 7], [20, 25], [50, 53]]
[[1, 2], [5, 7], [20], [25], [50], [53]]
你通緝。
謝謝Jerska。正是我需要的。 – AndreiR
def group(a, n)
prev = a.first
a.slice_before { |x|
(x - prev > n).tap { prev = x }
}.to_a
end
a = [1,2,5,7,20,25,50,53]
group(a, 5) # => [[1, 2, 5, 7], [20, 25], [50, 53]]
group(a, 2) # => [[1, 2], [5, 7], [20], [25], [50], [53]]
感謝falsetru。好一個。 – AndreiR
def group(array, interval)
result = [[array[0]]]
array.inject do |x, y|
if y - x <= interval
result.last << y
else
result << [y]
end
y
end
result
end
a=[1,2,5,7,20,25,50,53]
p group(a, 5) # => [[1, 2, 5, 7], [20, 25], [50, 53]]
p group(a, 2) # => [[1, 2], [5, 7], [20], [25], [50], [53]]
也許集團基於'國防部interval'? –
所以1在第一個例子中的7組中(7-1是6),因爲它接近於2接近7? – nurettin