Ruby

2010-10-05 1 views
28
belirtilen boyutta alt diziler diziler bölmek gerekiyor

Böyle bir şey bir dizi var: BenRuby

sub_arrays = split (arr, 3) 

gibi süslü bir yöntem Bu aşağıdaki dönmelidir istiyorum

arr = [4, 5, 6, 7, 8, 4, 45, 11] 

: [[4, 5, 6], [7,8,4], [45,11]]

cevap

45
arr.each_slice(3).to_a 

each_slice bir Enumerable döndüren, bunun için yeterli olmadığını Sen, to_a'u aramana gerek yok. 1.8.6 yılında

yapmanız gereken:

require 'enumerator' 
arr.enum_for(:each_slice, 3).to_a 

sadece yineleme gerekiyorsa, sadece yapabilirsiniz:

arr.each_slice(3) do |x,y,z| 
    puts(x+y+z) 
end 
+0

Teşekkürler! Bu gerçekten hızlıydı! – bragboy

+4

Veya 'b = []; b << a.shift (3) a.empty? '(eski Rubys için) – Nakilon

+0

@Nakilon: Bu orijinal diziyi yok edecektir. – sepp2k

3

senin gibi bir şey yapabilirsiniz 2.3+ Rayları kullanılıyorsa Bu:

arr.in_groups(3, false) 

Checkout the api docs

+0

Bu yanlış. Yazarın belirttiği gibi, bir diziyi belirtilen boyuttaki alt dizilere ayırmaz. 3 grup oluşturur, 3 –

4

da belirli bir amaç ile bu yararlanabilirler: durumunda

((1..10).group_by {|i| i%3}).values #=> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]] 

sadece iki bölümlenmiş diziler istiyorum: Rails

(1..6).partition {|v| v.even? } #=> [[2, 4, 6], [1, 3, 5]] 
+0

dizisi dizisi değil, dizi.group_by' çok kullanışlıdır. Aşağıdakileri yapabilirsiniz: false_group, true_group = some_array.group_by {| i | i.test_something?()}. values' – Automatico

1

Eğer belirtilen boyutta gruplar halinde bir dizi böler yöntemi in_groups_of kullanabilirsiniz yöntem in_groupsOysa

arr.in_groups_of(3) # => [[4, 5, 6], [7, 8, 4], [45, 11, nil]] 
arr.in_groups_of(3, false) # => [[4, 5, 6], [7, 8, 4], [45, 11]] 
bir diziyi belirtilen sayıda dengeli gruba böler.
arr.in_groups(5) # => [[4, 5], [6, 7], [8, 4], [45, nil], [11, nil]] 
arr.in_groups(5, false) # => [[4, 5], [6, 7], [8, 4], [45], [11]]