我有一个对象数组,我想根据2个相邻元素的属性之间的差异对它们进行分组.该数组已按该属性排序.例如:
原始阵列:
array = [a, b, c, d, e]
和
a.attribute = 1
b.attribute = 3
c.attribute = 6
d.attribute = 9
e.attribute = 10
Run Code Online (Sandbox Code Playgroud)
如果我想对元素进行分组,使得2个相邻元素的属性之间的差异小于或等于2,则结果应如下所示:
最终结果
result_array = [[a, b], [c], [d, e]]
是)我有的
def group_elements_by_difference(array, difference)
result_array = []
subgroup = []
last_element_attribute = array.first.attribute
array.each do |element|
if element.attribute <= (last_element_attribute + difference)
subgroup << element
else
#add the subgroup to the result_array
result_array << subgroup
subgroup = []
subgroup << element
end
#update last_element_attribute
last_element_attribute = element.attribute
end
result_array << subgroup
end
Run Code Online (Sandbox Code Playgroud)
题
Ruby 1.9.3中是否有内置函数,比如group_by可以取代我的group_elements_by_difference?
以下使用数字直接,但算法应与使用属性时的算法相同.它假设所有数字都大于0.如果没有,那么用有效的东西替换它.
array = [1, 3, 6, 9, 10]
[0, *array].each_cons(2).slice_before{|k, l| l - k > 2}.map{|a| a.map(&:last)}
# => [[1, 3], [6], [9, 10]]
Run Code Online (Sandbox Code Playgroud)
使用属性,do l.attribute等,并替换0为属性为的虚拟元素0.