2012-10-19 22 views
5
a = [3, 4, 7, 8, 3] 
b = [5, 3, 6, 8, 3] 

Giả sử các mảng có cùng chiều dài, có cách nào để sử dụng each hoặc một số cách thành ngữ khác để có được kết quả từ mỗi phần tử của cả hai mảng không? Không sử dụng bộ đếm?Có cách nào thành ngữ để hoạt động trên 2 mảng trong Ruby không?

Ví dụ, để có được những sản phẩm của mỗi yếu tố: [15, 12, 42, 64, 9]

(0..a.count - 1).each do |i| là quá xấu xí ...

của Ruby 1.9.3

Trả lời

4

Vì lý do hiệu suất, zip có thể tốt hơn, nhưng transpose giữ tính đối xứng và dễ hiểu hơn.

[a, b].transpose.map{|a, b| a * b} 
# => [15, 12, 42, 64, 9] 

Một sự khác biệt giữa ziptranspose là trong trường hợp các mảng không có cùng độ dài, chèn cựu nil như một mặc định trong khi sau này đặt ra một lỗi. Tùy thuộc vào tình hình, bạn có thể ủng hộ một trong những khác.

6

gì về việc sử dụng Array.zip:

>> a = [3,4,7,8,3] 
=> [3, 4, 7, 8, 3] 
>> b = [5,3,6,8,3] 
=> [5, 3, 6, 8, 3] 
>> c = [] 
=> [] 
>> a.zip(b) do |i, j| c << i * j end 
=> [[3, 5], [4, 3], [7, 6], [8, 8], [3, 3]] 
>> c 
=> [15, 12, 42, 64, 9] 

Lưu ý: Tôi rất nhiều không phải một lập trình viên Ruby vì vậy tôi apolo gize cho bất kỳ thành ngữ mà tôi đã chà đạp trên tất cả.

+0

sắp viết nó. đó là cách tôi sẽ làm điều đó :) – Castilho

+0

@Castilho: suy nghĩ đầu tiên của tôi là, chết tiệt ... Ruby phải có phương pháp 'zip' ở đâu đó. Tôi đến từ vùng đất của Python nên mất vài giây để tìm nó. –

+4

Niềng răng thường được sử dụng với một lớp lót ('a.zip (b) .each {| i, j | c << i * j}') nhưng đó không chính xác là * chà đạp *. Và 'map' sẽ phù hợp hơn trong trường hợp cụ thể này:' c = a.zip (b) .map {...} ' –

Các vấn đề liên quan