2012-04-02 42 views
7

Tôi có thể lấy một giá trị ngẫu nhiên từ một cấu trúc giống như mảng bằng cách lấy một chỉ mục ngẫu nhiên.Làm thế nào để lấy một đối tượng ngẫu nhiên từ một cá thể NSSet?

Làm cách nào để lấy giá trị ngẫu nhiên từ đối tượng NSSet lưu trữ đối tượng NSNumber? Tôi không thể tìm thấy một phương pháp dụ của NSSet mà lấy một giá trị ngẫu nhiên.

+2

sử dụng '[mySet allObjects]' mà sẽ trả về một mảng và sau đó sử dụng logic hiện tại của bạn để nhận được một chỉ số ngẫu nhiên –

+0

bbum gặp phải một sai lầm lớn mà tôi đã thực hiện trong câu trả lời của tôi, cảm ơn. Đã xóa. – Almo

+1

Bạn có muốn ngẫu nhiên không, hoặc bạn có quan tâm không? Cụ thể, ý tôi là, "Bạn có biết về' - [NSSet anyObject] '?" –

Trả lời

5

Tóm lại, bạn không thể trực tiếp truy lục đối tượng ngẫu nhiên từ NSSet.

Bạn cần phải biến bộ thành mảng - thành thứ gì đó có chỉ mục có thể được phân ngẫu nhiên - bằng cách kiến ​​trúc lại mã của bạn để sử dụng mảng hoặc bạn có thể thực hiện việc này bằng cách sử dụng bit mã giả này :

randomIndex = ...random-generator....(0 .. [set count]); 
__block currentIndex = 0; 
__block selectedObj = nil; 
[set enumerateObjectsWithOptions:^(id obj, BOOL *stop) { 
    if (randomIndex == currentIndex) { selectedObj = obj; *stop = YES } 
    else currentIndex++; 
}]; 
return selectedObj; 

Có - nó lặp lại tập hợp, có thể toàn bộ, khi chụp đối tượng. Tuy nhiên, lặp lại đó là khá nhiều những gì sẽ xảy ra trong quá trình chuyển đổi sang NSArray. Miễn là bộ không phải là lớn và bạn không gọi nó là rằng thường xuyên, không có vấn đề lớn.

+0

Ý tưởng chung ở đây là chính xác, tuy nhiên tôi cần phải tinh chỉnh và triển khai mã giả để biên dịch . Đây là phiên bản của tôi: https://gist.github.com/4392708 – Eliot

4

Trong khi tôi thích câu trả lời @bbum đó sẽ chấm dứt sớm trong một số trường hợp do sử dụng stop trong khối điều tra.

Để dễ đọc và dễ ghi nhớ những gì đang xảy ra khi bạn xem lại đoạn mã này trong tương lai tôi sẽ đi với đề nghị đầu tiên của ông turn the set into an array

NSInteger randomIndex = ..random-generator....(0 .. [set count]) 
id obj = [set count] > 0 ? [[set allObjects] objectAtIndex:randomIndex] : nil; 
Các vấn đề liên quan