如果它是一个Integer,则在数组中添加值

时间:2017-02-18 20:49:32

标签: ruby

array=[6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]

如果一个元素等于十,我想抓住数组中接下来的两个值并将它们添加到十,而不删除nil值。预期的输出是:

[6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]

1 个答案:

答案 0 :(得分:1)

<强>代码

def change_da_10s(arr)
  nil_indices = arr.each_index.reject { |i| arr[i] }
  arr.compact.concat([0, 0]).
      each_cons(3).
      map { |v| v.first == 10 ? v.sum : v.first }.
      tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } }
end

示例

arr = [6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]

change_da_10s(arr)
  #=> [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5] 

<强>解释

以下三个主要步骤。

保存nil s。

的索引
nil_indices = arr.each_index.reject { |i| arr[i] }
  #=> [5, 11, 13]

删除nil,在末尾添加两个零,然后将每个三元组映射到正确的值。

a = arr.compact.
        concat([0, 0]).
        each_cons(3).
        map { |v| v.first == 10 ? v.sum : v.first }
  #=> [6, 2, 7, 1, 19,      9, 0, 8, 2, 23,      18,      3, 5, 7, 2, 5, 5] 

返回值的差距仅仅是显示nil的位置。

此计算需要以下步骤。

arr = [6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]

b = arr.compact
  #=> [6, 2, 7, 1, 10,      9, 0, 8, 2, 10,      10,      3, 5, 7, 2, 5, 5] 
c = b.concat([0, 0])
  #=> [6, 2, 7, 1, 10,      9, 0, 8, 2, 10,      10,      3, 5, 7, 2, 5, 5, 0, 0] 
e = c.each_cons(3)
  #=> #<Enumerator: [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 0, 0]
  # :each_cons(3)>

我们可以通过在其上调用Enumerable#entries(或Enumerable#to_a)来查看此枚举器生成的值。

e.entries
  #=> [[6, 2, 7], [2, 7,  1], [7,  1, 10], [ 1, 10, 9], [10, 9, 0], [9, 0, 8],
  #    [0, 8, 2], [8, 2, 10], [2, 10, 10], [10, 10, 3], [10, 3, 5], [3, 5, 7],
  #    [5, 7, 2], [7, 2,  5], [2,  5,  5], [ 5,  5, 0], [5, 0, 0]] 

最后,

e.map { |v| v.first == 10 ? v.sum : v.first }
  #=> [6, 2, 7, 1, 19, 9, 0, 8, 2, 23, 18, 3, 5, 7, 2, 5, 5] 

Enumerable#sum在Ruby v2.4中首次亮相。对于早期版本,请使用Enumerable#reduce(又名inject)。

nil推回到他们所属的a

a.tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } }
  #=> [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]