通过比较2个相邻元素对数组进行分组

AbM*_*AbM 3 ruby arrays

我有一个对象数组,我想根据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

saw*_*awa 5

以下使用数字直接,但算法应与使用属性时的算法相同.它假设所有数字都大于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.