Re: -[NSMutableSet randomObject]
Re: -[NSMutableSet randomObject]
- Subject: Re: -[NSMutableSet randomObject]
- From: "Michael A. Crawford" <email@hidden>
- Date: Tue, 25 May 2010 12:58:24 -0400
Hey, not bad. Does the -allObjects method always return the same sequence? Did you just cobble this up or is this running in a system somewhere? It doesn't do everything I want but it is definitely the better part of the 80/20 rule.
-Michael
On May 25, 2010, at 12:52 PM, Dave DeLong wrote:
> What about something like:
>
> @implementation NSSet (Random)
>
> - (id) randomObject {
> NSArray * allObjects = [self allObjects];
> if ([allObjects count] == 0) { @throw ...; }
> return [allObjects objectAtIndex:(arc4random() % [allObjects count])];
> }
>
> @end
>
> On May 25, 2010, at 10:49 AM, Michael A. Crawford wrote:
>
>> I'd like to extend Apple implementation of NSMutableSet to include a randomObject method. The purpose of this method is self-explanatory and its potential use is I'm sure obvious to most of you.
>>
>> For my first idea I thought about simply adding a category to NSMutableSet but any obvious implementation of -randomObject would require accessing existing instance variables or adding my own in order to implement the random access I would need to for the set. I also don't know how objects are stored internally. Is it an array? Is it a key/value pair? I don't know. How am I going to correlate the random numbers I generate with the objects in the set?
>>
>> Next, I thought about using inheritance with NSMutableArray. I even wrote some code:
>>
>> + (void)initialize
>> {
>> if ( self == [MCRandomlyAccessedArray class] )
>> {
>> srandom(time(NULL));
>> }
>> }
>>
>> - (id)randomObject
>> {
>> // If the array is empty, throw an exception. The caller should know better.
>> // If there is only one, return object zero every time.
>> // If there are only two, alternate with every access.
>> // If there are three or more, randomize but never provide the same object
>> // twice in a row.
>> if ( [self count] )
>> {
>> NSUInteger index = 0;
>>
>> if ( [self count] > 1 )
>> {
>> if ( 2 == [self count] )
>> {
>> index = (++lastObjectIndex % 2);
>> }
>> else
>> {
>> do
>> {
>> index = (random() % [self count]);
>> } while (index == lastObjectIndex);
>> }
>> lastObjectIndex = index;
>> }
>> return [self objectAtIndex:index];
>> }
>> else
>> {
>> [[NSException exceptionWithName:NSRangeException
>> reason:@"Array is empty"
>> userInfo:nil] raise];
>> }
>> return nil; // unreachable
>> }
>>
>> Come to find out at runtime that this won't work either because NSMutableArray is abstract!
>>
>> *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray addObject:]: method only defined for abstract class. Define -[MCRandomlyAccessedArray addObject:]!'
>>
>> This would seem to indicate that I need to write a lot more code in order to have a complete implementation. I'm not in the mood to re-invent the wheel. I'm not lazy, I just have a lot of other code that needs to be written, which pertains to the big picture.
>>
>> Next, I thought maybe I could simply wrap-up an NSMutableArray in my own class and let it do most of the heavy lifting when it comes to all of those existing methods. The only problem is that I'm no expert on how to duplicate all of the class and instance init methods and memory management code.
>>
>> So, that brings me to you lovely people. What do you recommend? Do I bite the bullet and re-implement NSMutableArray? If so, where can I find guidance on this? I love the containers provided by Apple. They simply work and I don't have to think about them. So much so, that I don't really know how they work. My expertise is/was in C/C++ and STL.
>>
>> Is there fourth alternative or something I missed in my brief examination as described above?
>>
>> Thanks.
>>
>> -Michael
>> _______________________________________________
>>
>> Cocoa-dev mailing list (email@hidden)
>>
>> Please do not post admin requests or moderator comments to the list.
>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>
>> Help/Unsubscribe/Update your Subscription:
>>
>> This email sent to email@hidden
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden