我有三个数组:g
,a
和b
。 g
有两组,包含一个或多个连续的nil
值。第一个(第二个)组包含a.size
(b.size
)nil
s。我希望将第一个(第二个)组中的每个nil
替换为a
(b
)的相应元素。例如,如果:
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]
我该怎么做?
答案 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
请注意,我们以相反的方式插入,以免干扰索引。