2010-10-05 19 views

Trả lời

45
arr.each_slice(3).to_a 

each_slice trả về một số, vì vậy nếu đủ cho bạn, bạn không cần phải gọi số to_a.

Trong 1.8.6 bạn cần làm:

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

Nếu bạn chỉ cần lặp lại, bạn chỉ có thể làm:

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

Cảm ơn! điều đó rất nhanh! – bragboy

+4

Hoặc 'b = []; b << a.shift (3) cho đến a.empty? '(đối với Rubys cũ) – Nakilon

+0

@Nakilon: Điều đó sẽ phá hủy mảng gốc mặc dù. – sepp2k

3

Nếu bạn sử dụng Rails 2.3 + bạn có thể làm một cái gì đó như này:

arr.in_groups(3, false) 

Checkout the api docs

+0

Điều này là sai. Nó không chia một mảng thành mảng phụ có kích thước xác định, như tác giả nói. Nó tạo ra 3 nhóm, bun không phải là mảng của 3 –

4

cũng có thể sử dụng điều này với một mục đích cụ thể:

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

trong trường hợp bạn chỉ muốn hai mảng phân vùng:

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

'mảng.group_by' là rất hữu ích. Bạn có thể làm như sau: 'false_group, true_group = some_array.group_by {| i | i.test_something?()}. – Automatico

1

Trong Rails bạn có thể sử dụng phương pháp in_groups_ofchia tách một mảng thành các nhóm kích thước quy định

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]] 

Trong khi phương pháp in_groupschia một mảng thành số nhóm được cân đối được chỉ định

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]] 
Các vấn đề liên quan