2009-08-04 22 views
52

Ruby 1.8.6'da, her biri bir int olan 100.000 kullanıcı kimliğine sahibim. Bu kullanıcı kimlikleri üzerinde bir kod bloğu gerçekleştirmek istiyorum ancak bunları yığınlarda yapmak istiyorum. Örneğin, bunları bir seferde 100 işlemek istiyorum. Bunu mümkün olduğunca basit bir şekilde nasıl kolayca başarabilirim?Ruby'de bir dizi nasıl oluşturulur

Ben aşağıdaki gibi bir şey yapabileceğini, ama muhtemelen daha kolay bir yolu var:

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

olası yinelenen (http://stackoverflow.com/questions/3864139/need-to-split-arrays-to-sub-arrays- Belirtilen boyutta-ruby) – Nakilon

+0

@Nakilon: Bu soru bundan daha yeni değil mi? –

+0

@Andrew Grimm, iki sorudan hangisinin kapanacağına karar vermek için, bugüne bakmıyorum, ama cevapların kalitesiyle. Demek istediğim, buraya bakan bir kişiye tavsiyem, oraya gitmek için) – Nakilon

cevap

100

Kullanım each_slice: başlık altında each_slice kullanır

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

Bunun işe yaraması için açıkça "numaralandırma" belirtecine sahip olmanız gerektiğini unutmayın: Yöntem, bu yanıtın yanlış olduğunu düşünmeme neden olan Enumerable ile karışan sınıflarda mevcut değildir. Sonra daha iyi öğrendim. –

+4

Evet, bunun işe yaraması için 1.8.6'da 'enumerator' gerekiyor (bu yüzden yaptım). 1.8.7+ sayım memuru çekirdeğe taşındı ve artık buna gerek yok. Ancak böyle yapmak bir hataya neden olmaz, ancak yanlış bir şekilde geri döner. Bu nedenle, uygunluk nedenlerinden dolayı, numaralandırıcıdan yöntemleri kullanırken her zaman 'numaralandırıcı' (code) gerektirmelidir, böylece kod rubyenin tüm sürümleriyle çalışacaktır. – sepp2k

+0

Çok teşekkür ederim. :) – ChrisInEdmonton

20

Raylar in_groups_of sahiptir.

userids.in_groups_of(100){|group| 
    //process group 
} 
[Ruby belirtilen boyutta alt diziler diziler bölmek gerekiyor] arasında
+3

Rails kullanmıyoruz. Bizim için yeterince uzak değil; veritabanlarımız yaklaşık 26 parça arasında keskinleşir. Ayrıca, başka bir veritabanı sunucusuna sahibiz, muhtemelen başka bir yirmi ya da öylesine, bunlar henüz keskin değil. Öneriniz için teşekkürler, bununla birlikte, birçok insan için yararlı olacağına eminim. – ChrisInEdmonton

+1

Evet, rayları kullanmadığınızı anladınız, bu yüzden kaynağa bağlandım, böylece isterseniz yöntemi çekebildiniz. – wombleton

+0

Ve neden size bir + 1 verdim. :) Özellikle benim için çalışmayan, ama başkaları için iyi bir cevap. – ChrisInEdmonton

İlgili konular