2013-10-04 18 views
5

Tôi có hai mảngHãy so sánh hai mảng và Hủy bỏ các giá trị độc đáo

ordered = [1, 2, 3, 4, 5] 

some_list = [2, 6, 4] 

Tôi muốn so sánh hai mảng, sau đó tìm các bản sao, và tạo nó thành một mảng mới. Bí quyết là giữ cho mảng theo thứ tự được cung cấp trong mảng ordered.

new_array = [2, 4] # Result should be this 

Tôi đã nghĩ ra một cách để làm điều đó, tuy nhiên tôi nghĩ hiệu suất có thể được cải thiện.

ordered.each do |value1| 
    some_list.include? value1 
    new_array << value1 
    end 
end 

Có cách nào để tôi có thể cải thiện điều này không?

Benchmark quả

    user  system  total  real 
    using &  0.210000 0.000000 0.210000 ( 0.212070) 
    using select 0.220000 0.000000 0.220000 ( 0.218889) 

Trả lời

4

Hãy thử điều này new_arry = order­ed & some_­list

+0

Đó là độc đáo cú pháp ngắn gọn, nhưng nó kéo lên vào mã tối ưu so với vòng lặp của mình, hoặc nó sẽ kết thúc được tốc độ tương đương nhưng vẫn đẹp hơn để gõ? –

+0

Tôi đang chạy điểm chuẩn để so sánh cả hai như tôi nói ... – jason328

+1

câu trả lời này sẽ không duy trì trật tự. Tôi cập nhật nó thành 'new_arry = order & some_list' để nó giữ lệnh được định nghĩa trong mảng' ordered'? thứ tự của các phần tử trong mảng mới phụ thuộc vào mảng đầu tiên. –

1
ordered.select{|i| some_list.include?(i)} 

Edit:

Không thực sự chắc chắn nếu chọn được tối ưu hóa cho hiệu suất, nhưng nó được cung cấp như thay thế ngắn hơn và rõ ràng đối với mã do OP cung cấp.

Điểm chuẩn nhanh đã cho kết quả này: Chỉnh sửa: thêm phương án trả lời được chấp nhận.

  user  system  total  real 
    each 0.000000 0.000000 0.000000 ( 0.000005) 
select 0.000000 0.000000 0.000000 ( 0.000004) 
    & 0.000000 0.000000 0.000000 ( 0.000005) 
+0

không phải là điều này chỉ là viết tắt cho vòng lặp thứ hai của mình? Được chọn tối ưu hóa đáng kể bằng cách so sánh? (không phải là một anh chàng ruby) –

+0

Vâng tôi thực sự chỉ nhận ra có kết quả cận biên. Hmm. Tôi sẽ cho anh ta tín dụng kể từ khi anh ta trả lời trước tiên. Tôi thích bạn sử dụng lựa chọn mặc dù, tôi đã không nghĩ về nó. – jason328

+2

Tôi đã chạy điểm chuẩn và nếu bạn so sánh các mảng lớn của chuỗi với thứ tự đảo ngược (do đó khó có thể so khớp với CPU) thì bạn nhận được thứ tự chênh lệch về tốc độ.'&' nhanh hơn 30 lần so với 'select' với' include'. –

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