Как чередовать 2 строковых массива в одну строку в Ruby? - PullRequest
3 голосов
/ 12 мая 2011

Имеется 2 строковых массива одинакового размера, например:

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

Как бы вы чередовали их в одну строку, например:

"what's your programming question? be specific."

?

Ответы [ 2 ]

13 голосов
/ 12 мая 2011

Вы можете использовать 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 голосов
/ 12 мая 2011
p [a, b].transpose.inject(''){|s, (a, b)| s << a << b}
# => "what's your programming question? be specific."

Добавлено в ответ на комментарий Эндрю

У меня нет возражений против мю слишком короткий ответ; Я думаю, что это довольно рубиново. Но так или иначе, использование inject или each_with_object быстрее, чем использование flatten и join. Ниже мой тест.

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

Результат (ruby 1.9.2 в Ubuntu Linux 11.04)

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...