2012-06-11 22 views

Trả lời

25

Làm thế nào về điều này:

array.delete_at(rand(array.length)) 
+0

Đây thực chất là hai các bước ('rand (array.length)' và 'array.delete_at (idx)'). OP đã yêu cầu chỉ có một phương pháp, nhưng có lẽ một trong những cách đơn giản nhất để thực hiện loại hoạt động này trong Ruby. – sindrenm

2

Linuxios của nó có hoàn hảo. Dưới đây là một ví dụ:

array = %w[A B C] 
item_deleted = array.delete_at(1) 

Dưới đây là trong IRB:

1.9.2p0 :043 > array = %w[A B C] 
=> ["A", "B", "C"] 
1.9.2p0 :044 > item_deleted = array.delete_at(1) 
=> "B" 
1.9.2p0 :045 > array 
=> ["A", "C"] 
1.9.2p0 :047 > item_deleted 
=> "B" 
+1

Cảm ơn các ví dụ khác. – Linuxios

1

Một thay thế cho các rand (array.length) phương pháp đã đề cập, có thể là này một

element = array.delete array.sample 

Eksample:

>> array = (1..10).to_a 
>> element = array.delete array.sample 
>> array # => [1, 2, 4, 5, 6, 7, 8, 9, 10] 
>> element # => 3 

Điều này cũng là một tập hợp của hai hoạt động, nhưng ít nhất bạn sẽ không phải di chuyển ra khỏi mảng đó.

+1

Điều này có thể kém hiệu quả hơn những người khác (xóa yêu cầu tìm kiếm) nhưng rõ ràng là trong nháy mắt những gì nó đang làm. – micapam

+0

Điều này đúng, nhưng tôi nghĩ nó dễ đọc hơn là sử dụng «rand', vì đã có cách tìm một phần tử ngẫu nhiên trong một mảng. Ngoài ra, chúng tôi không phải kéo dài độ dài của mảng, đó là điều chúng tôi thực sự không cần quan tâm. :-) – sindrenm

+0

Có - bởi 'hiển nhiên' Tôi có nghĩa là có thể đọc được :) – micapam

11

Một số khác không hiệu quả, nhưng siêu rõ ràng những gì đang xảy ra:

array.shuffle.pop 

Điều gì sẽ được tốt đẹp sẽ là một phiên bản phá hoại của phương pháp mẫu về mảng chính nó, một cái gì đó như:

class Array 
    def sample! 
    delete_at rand length 
    end 
end 
+3

Bottom line: một cái gì đó giống như ví dụ thứ hai của bạn (mặc dù trong ngôn ngữ mà thông dịch viên được thực hiện) nên là một phần của việc thực hiện mảng cốt lõi. Tôi có lẽ sẽ gọi nó là một cái gì đó như 'delete_sample!' Hoặc một cái gì đó, mặc dù, như tôi tìm thấy nó một chút rõ ràng hơn những gì nó làm. :-) – sindrenm

+1

Nó cần phải được array.shuffle! .pop – seo

+3

Nếu bạn đi cho tùy chọn này, và bạn muốn loại bỏ các mục từ mảng ban đầu bạn tốt hơn làm 'array.shuffle! .pop', hoặc người nào khác mảng của bạn sẽ vẫn như nó đã từng. Làm 'shuffle' mà không có bang (!) Sẽ chỉ cung cấp cho bạn một mảng khác để' pop' từ. – mjnissim

0

Nếu bạn cần lấy mẫu một số mục và xóa các mục đó khỏi mảng gốc:

array = (1..10).to_a 

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

grab = array.sample(4) 

=> [2, 6, 10, 5] 

grab.each{ |a| array.delete a } 

=> [2, 6, 10, 5] 

array 
=> [1, 3, 4, 7, 8, 9] 
+1

Điều này chỉ hoạt động nếu mảng ban đầu của bạn có đầy đủ các giá trị duy nhất, nếu không bạn sẽ xóa tất cả '2's – Anthony

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