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 (Cocoa-dev@lists.apple.com)
>> 
>> 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:
>> http://lists.apple.com/mailman/options/cocoa-dev/davedelong%40me.com
>> 
>> This email sent to davedel...@me.com
> 
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> 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:
> http://lists.apple.com/mailman/options/cocoa-dev/michaelacrawford%40me.com
> 
> This email sent to michaelacrawf...@me.com

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to