用其他两个数组中的值替换数组中的nil元素

时间:2015-07-05 08:34:19

标签: arrays ruby

我有三个数组:gabg有两组,包含一个或多个连续的nil值。第一个(第二个)组包含a.sizeb.sizenil s。我希望将第一个(第二个)组中的每个nil替换为ab)的相应元素。例如,如果:

g = [1, 2, nil, nil, nil, 3, nil, nil, nil, nil]
a = [55, 45, 56]
b = [100, 200, 300, 400]

我希望g成为:

 [1, 2, 55, 45, 56, 3, 100, 200, 300, 400]

我该怎么做?

4 个答案:

答案 0 :(得分:5)

[]=方法可以像这样分配,其变体之一是

foo[insertion_point, length] = values

(还有一个版本采用范围而不是这对值)

g = [1,2,nil,nil,nil,3,nil,nil,nil,nil]
a = [55,45,56]
b = [100,200,300,400]

g[2, a.size] = a
g #=> [1, 2, 55, 45, 56, 3, nil, nil, nil, nil]
g[6, b.size] = b
g #=> [1, 2, 55, 45, 56, 3, 100, 200, 300, 400]

只要间隙与您插入的数组大小相同,就不需要对nils做任何事情

答案 1 :(得分:1)

g.map!{|e| e || a.shift || b.shift}
# => [1, 2, 55, 45, 56, 3, 100, 200, 300, 400]

答案 2 :(得分:1)

我设置了一个枚举器,并在必要时从中拉取物品。其中任何一个都可以轻松扩展到更多输入列表

itr = (a + b).to_enum
g.map!{ |e| e.nil? || itr.next }

或者在这种情况下[a, b]可以用更通用的树替换

itr = [a, b].flatten.to_enum
g.map!{ |e| e.nil? || itr.next }

答案 3 :(得分:-1)

我认为你可以这样做:

g.insert(6, *b); // inserts b into 6 index
g.insert(2, *a); // inserts a into 2 index
g.compact! // removes the nil elements

请注意,我们以相反的方式插入,以免干扰索引。