如何在Ruby中将两个字符串数组交错成一个字符串?

3

给定两个相同大小的字符串数组,例如:

a = ["what's", " programming", " be"]
b = [" your", " question?", " specific."]

你如何将它们交错成一个字符串,即:
"what's your programming question? be specific."

?

2个回答

13
您可以使用zip将它们组合在一起,flatten来展开zip添加的额外数组,并使用join获取简单的字符串:
a.zip(b).flatten.join

如果您的数组中没有方便的空间:

a = ["what's", "programming", "be"]
b = ["your", "question?", "specific."]

然后你可以调整join

a.zip(b).flatten.join(' ')

如果您不确定是否存在空格,可以使用join将其添加(以确保),然后squeeze出任何重复项:

a.zip(b).flatten.join(' ').squeeze(' ')

2
p [a, b].transpose.inject(''){|s, (a, b)| s << a << b}
# => "what's your programming question? be specific."

回应安德鲁评论的补充

我对mu is too short的答案没有任何异议;我认为它很符合Ruby的风格。但是,使用injecteach_with_object比使用flattenjoin更快。以下是我的基准测试结果。

a = ["what's", " programming", "be"]
b = [" your", " question?", " specific."]

$n = 1000000
Benchmark.bmbm do |br|
  br.report('flatten join'){$n.times{
    a.zip(b).flatten.join
  }}
  br.report('inject'){$n.times{
    [a, b].transpose.inject(''){|s, (a, b)| s << a << b}
  }}
  br.report('each_with_object'){$n.times{
    [a, b].transpose.each_with_object(''){|(a, b), s| s << a << b}
  }}
end

结果(在Ubuntu Linux 11.04上的Ruby 1.9.2)

Rehearsal ----------------------------------------------------
flatten join       2.770000   0.000000   2.770000 (  2.760427)
inject             2.190000   0.000000   2.190000 (  2.195147)
each_with_object   2.160000   0.000000   2.160000 (  2.158263)
------------------------------------------- total: 7.120000sec

                       user     system      total        real
flatten join       2.810000   0.010000   2.820000 (  2.838118)
inject             2.190000   0.000000   2.190000 (  2.197567)
each_with_object   2.150000   0.000000   2.150000 (  2.148922)

@Andrew 我实际测试了一下,好像比使用 flattenjoin 稍微快一些。 - sawa
@sawa:有趣。你试过使用each_with_object了吗? - Andrew Grimm
@Andrew 我刚试了一下。each_with_object 仍然比 flattenjoin 快,但略慢于 inject。我认为我测试得没错。你也可以试试吗? - sawa
@sawa:抱歉,我早上(澳大利亚时间)在 Stack Overflow 上的狂热已经够大了。但是,提出一个单独的问题,询问为什么 each_with_objectinject 更慢可能是值得的。 - Andrew Grimm
@Andrew 我会尝试一下。同时,我会添加我的基准测试。 - sawa
@Andrew 实际上,在这种情况下,each_with_objectinject之间的区别微妙,甚至在我另一次基准测试中反过来了。 - sawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接