2013-10-01 1 views
3

Массив Exempleрубин карта массива и присоединиться к одной петле

[ 
[ 
    "Francis", 
    "Chartrand", 
    "[email protected]" 
], 
[ 
    "Francis", 
    "Chartrand", 
    "[email protected]" 
],... 
] 

Результат хотел

"[email protected], [email protected], ..." 

Мое решение (две петли)

array.map{|a| a[2]}.join(", ") 

Можно ли сделать это с помощью одного цикла?

+1

Это домашнее задание? –

+1

Я бы не рассматривал 'join' как цикл. –

+0

@SergioTulentsev Ahah не для домашней работы, просто для рефакторинга и личной информации –

ответ

5

Использование Enumerable#inject мы можем сделать задачу в одном цикле:

a = [ 
    ["Francis", "Chartrand", "[email protected]"], 
    ["Francis", "Chartrand", "[email protected]"] 
] 
a.inject(nil) {|str, arr| str ? (str << ', ' << arr[2]) : arr[2].dup} 
#=> "[email protected], [email protected]" 

Однако, это только академическая вещь, потому что map/join быстрее и более удобным для чтения в любом случае. См this benchmark:

   user system total  real 
map/join 1.440000 0.000000 1.440000 (1.441858) 
inject 2.220000 0.000000 2.220000 (2.234554) 
+0

Хороший ответ, но карта и соединение еще быстрее http://gist.github.com/chartrandf/6779594 –

+4

@FrancisChartrand Конечно, карта и присоединение не только быстрее, но и более прямолинейно. И об этом все говорят вам. Но поскольку вы настаиваете на том, чтобы не использовать карту и присоединиться, а так как вы настаиваете на том, чтобы делать это в одном цикле, и поскольку вы не упоминаете скорость в вопросе, это то, что вы получаете. – sawa

+0

FrancisChartrand, увидев, что вы оба правы. map/join быстрее (я создал [второй тест] (https://gist.github.com/tessi/6779700), где мой ответ оптимизирован для производительности (поэтому его немного более справедливо)). Мне лучше сказать, что в моем ответе :) – tessi

0

Вот один подход, но он не может быть особенно быстро.

s = ''   
array.flatten.each_slice(3) {|e| s += e.last + ', '} 
s.chop.chop 

Вот еще:

array.transpose[2].join(', ') 

Я предполагаю, что вы хотели одну строку адреса электронной почты для всего массива.