2009-08-04 4 views
52

В Ruby 1.8.6 у меня есть массив, скажем, 100 000 идентификаторов пользователей, каждый из которых является int. Я хочу выполнить блок кода для этих идентификаторов пользователей, но я хочу сделать это в кусках. Например, я хочу обрабатывать их по 100 за раз. Как я могу легко достичь этого как можно проще?Как разбить массив в Ruby

я мог бы сделать что-то вроде следующего, но, вероятно, есть более простой способ:

a = Array.new 
userids.each { |userid| 
    a << userid 
    if a.length == 100 
    # Process chunk 
    a = Array.new 
    end 
} 
unless a.empty? 
    # Process chunk 
end 
+0

возможно дубликат [Необходимо разделить массивы на подразделы массивы указанного размера в Рубине] (http://stackoverflow.com/questions/3864139/need-to-split-arrays-to-sub-arrays- of-defined-size-in-ruby) – Nakilon

+0

@Nakilon: Разве этот вопрос не является более новым, чем этот? –

+0

@ Андрю Гримм, чтобы решить, какой из двух вопросов закрыть, я смотрю не на дату, а на качество ответов. Я имею в виду, я советую человеку, который смотрит сюда, пойти туда) – Nakilon

ответ

100

each_slice Использование:

require 'enumerator' 
userids.each_slice(100) do |a| 
    # do something with a 
end 
+3

Обратите внимание, что вам действительно нужно явно «потребовать« перечислитель »для этого: этот метод недоступен в классах, которые смешиваются в Enumerable, что изначально привело меня к мысли, что этот ответ был неправильным. Потом я узнал лучше. –

+4

Да, для этого вам нужно потребовать «перечислитель» в 1.8.6 (вот почему я и сделал). В 1.8.7+ перечислитель переместился в ядро, и вам больше не нужно его требовать. Однако это не приведет к ошибке, а просто вернет false. Поэтому по соображениям совместимости вам всегда нужно «перечислить» при использовании методов из перечислителя, чтобы код работал со всеми версиями ruby. – sepp2k

+0

Большое спасибо. :) – ChrisInEdmonton

20

Rails имеет in_groups_of, который под капотом использует each_slice.

userids.in_groups_of(100){|group| 
    //process group 
} 
+3

Мы не используем Rails. Он недостаточно масштабируется для нас; наши базы данных распределены примерно на 26 осколков. Кроме того, у нас есть значительное количество других серверов баз данных, возможно, еще около двадцати, хотя они не отложены. Спасибо за предложение, однако, я уверен, что это будет полезно для многих других людей. – ChrisInEdmonton

+1

Да, понял, что вы не использовали рельсы, поэтому я связался с источником, чтобы вы могли вытащить метод, если хотите. – wombleton

+0

И почему я наградил вас +1. :) Хороший ответ, который специально не работал для меня, но для других. – ChrisInEdmonton

Смежные вопросы