To make Sets correctly work, the objects have to implement a pair of comparison methods which must act in a coordinated way :
The message
is expected to report whether newElement is equal to oldElement.[newElement isEqual:oldElement]
The message
should return an integer which is equal for all objects for which isEqual: is true.[newElement hash]
Sets place all objects added to them into a hash table based on the results of sending the objects the hash message. Set assumes that, after being added to a set, objects, and their hash value, will not be changed. If any object does change, it will not be located properly in the set. The result of this is that the object will not be found or that it will be added to the set more than once.
+newReturns a new empty set.
+new:(unsigned)nReturns a new empty set, which can hold at least n elements.
+with:(int)nArgs,...Returns a new object with nArgs elements. For example,
creates a collection and adds anObject and otherObject to it. In a similar way, Set or SortCltn instances can be created like this.id aCltn = [OrdCltn with:2,anObject,otherObject];
+with:firstObjectwith:nextObjectThis method is equivalent to with: 2,firstObject,nextObject.
+add:firstObjectThis method is equivalent to with: 1,firstObject.
This (factory) method has the same name as the instance method add: and can be used as follows, in circumstances when the user does not want to allocate a collection unless it is actually used :
This shows that creation of the collection is delayed until it is actually needed. If the collection already exists, objects are simply added, using the instance method add:.aCltn = [ (aCltn)?aCltn:OrdCltn add:myObject ];
-copyReturns a new copy of the set.
-deepCopyReturns a new copy of the set. The elements in the new set are deep copies of the elements in the original set.
-emptyYourselfEmpties all the members of the set (without freeing them). Returns the receiver.
-freeContentsRemoves and frees all the members of the set, but doesn't free the set itself. Returns the receiver.
-freeFrees the set, but not its elements. Returns nil. Do :
if you want to free the set and its contents.set = [[set freeContents] free];
- (unsigned)sizeReturns the number of elements in the set.
- (BOOL)isEmptyWhether the number of objects in the set is equal to zero.
-eachElementReturns a sequence of elements in the set.
seq = [set eachElement]; while ((anElement = [aSeq next])) { /* do something */ } aSeq = [aSeq free];
- (BOOL)isEqual:setReturns YES if set is a set, if set has the same number of elements as the receiver, and if each member of the contents of set is contained in the receiver's contents.
-add:anObjectAdds anObject if it was not previously in the set, but doesn't inform the caller about the addition because the receiver is always returned.
-addNTest:anObjectAdds anObject if it was not previously in the set. Returns anObject if the addition takes place, otherwise returns nil.
-filter:anObjectThe filter: method has a special purpose. If there is a matching object in the set, then anObject is freed, and the matching object is returned. Otherwise, anObject is added and returned.
-add:anObjectifDuplicate:aBlockAdds and returns anObject, if there was no duplicate previously in the set.
Otherwise, this method evalutes aBlock and returns the matching object (the object that was already in the set).
For example, the filter: method is equivalent to :
[ set add: anObject ifDuplicate: { [anObject free] }];
-replace:anObjectIf a matching object is found, then anObject replaces that object, and the matching object is returned. If there is no matching object, anObject is added to the receiver, and nil is returned.
-remove:oldObjectRemoves oldObject or the element which matches it using isEqual:. Returns the removed entry, or nil if there is no matching entry.
Note: The remove: method of the OrdCltn class is implemented to remove an exact match. The Set class uses a match in the sense of isEqual: instead.
-remove:oldObjectifAbsent:exceptionBlockRemoves oldObject or the element which matches it using isEqual:. Returns the removed entry, or return value of exceptionBlock if there is no matching entry.
For example, the method remove: is equivalent to :
Note: The remove: method of the OrdCltn class is implemented to remove an exact match. The Set class uses a match in the sense of isEqual: instead.[ set remove: oldObject ifAbsent: { nil } ];
- (BOOL)includesAllOf:aCltnAnswer whether all the elements of aCltn are in the receiver, by sending includes: for each individual element.
- (BOOL)includesAnyOf:aCltnAnswer whether any element of aCltn is in the receiver, by sending includes: for each individual element.
-addAll:aCltnAdds each member of aCltn to the receiver. If aCltn is nil, no action is taken. The argument aCltn need not be a collection, so long as it responds to eachElement in the same way as collections do. Returns the receiver.
Note: If aCltn is the same object as the receiver, a addYourself message is sent to the object.
-addContentsOf:aCltnThis method is equivalent to addAll: and is provided for Stepstone ICpak101 compatibility.
-addContentsTo:aCltnThis method is equivalent to addAll:, but with argument and receiver interchanged, and is provided for Stepstone ICpak101 compatibility.
-removeAll:aCltnRemoves all of the members of aCltn from the receiver. The argument aCltn need not be a collection, as long as it responds to eachElement as collections do. Returns the receiver.
Note: If aCltn is the same object as the receiver, it empties itself using emptyYourself and returns the receiver.
-removeContentsFrom:aCltnThis method is equivalent to removeAll:, and is provided for compatibility with Stepstone ICpak101.
-removeContentsOf:aCltnThis method is equivalent to removeAll:, and is provided for compatibility with Stepstone ICpak101.
-intersection:bagReturns a new Collection which is the intersection of the receiver and bag. The new Collection contains only those elements that were in both the receiver and bag. The argument bag need not be an actual Set or Bag instance, as long as it implements find: as Sets do.
-union:bagReturns a new Collection which is the union of the receiver and bag. The new Collection returned has all the elements from both the receiver and bag. The argument bag need not be an actual Set or Bag instance, as long as it implements eachElement: as Sets and Bags do.
-difference:bagReturns a new Collection which is the difference of the receiver and bag. The new Collection returned has only those elements in the receiver that are not in bag.
-asSetCreates a Set instance and adds the contents of the object to the set.
-asOrdCltnCreates a OrdCltn instance and adds the contents of the object to the set.
-detect:aBlockThis message returns the first element in the receiver for which aBlock evaluates to something that is non-nil . For example, the following :
Returns nil if there's no element for which aBlock evaluates to something that non-nil.[ aCltn detect: { :each | [each isEqual:anObject] } ];
-detect:aBlockifNone:noneBlockThis message returns the first element in the receiver for which aBlock evaluates to something that is non-nil.
Evaluates noneBlock if there's no element for which aBlock evaluates to something that is non-nil, and returns the return value of that block. For example,
[ aCltn detect: { :e | [e isEqual:anObject]} ifNone: {anObject} ];
-select:testBlockThis message will return a subset of the receiver containing all elements for which testBlock evaluates to an Object that is non-nil. For example,
Returns a new empty instance of the same class as the receiver, if there's no element for which testBlock evaluates to something that is non-nil.[ aCltn select: { :each | [each isEqual:anObject] } ];
-reject:testBlockComplement of select:
This message will return a subset of the receiver containing all elements for which testBlock evaluates to nil. For example,
Returns a new empty instance of the same class as the receiver, if there's no element for which testBlock evaluates to nil.[ aCltn reject: { :each | [each isEqual:anObject] } ];
-collect:transformBlockThis message creates and returns a new collection of the same size and type as the receiver. The elements are the result of performing transformBlock on each element in the receiver (elements for which the Block would return nil are filtered out).
- (unsigned)count:aBlockEvaluate aBlock with each of the receiver's elements as the argument. Return the number that answered a non-nil value.
-elementsPerform:(SEL)aSelectorSend aSelector to all objects in the collection, starting from the object at offset 0. For Stepstone compatibility. Producer uses this.
-elementsPerform:(SEL)aSelectorwith:anObjectSend aSelector to all objects in the collection, starting from the object at offset 0. For Stepstone compatibility. Producer uses this.
-elementsPerform:(SEL)aSelectorwith:anObjectwith:otherObjectSend aSelector to all objects in the collection, starting from the object at offset 0. For Stepstone compatibility. Producer uses this.
-elementsPerform:(SEL)aSelectorwith:anObjectwith:otherObjectwith:thirdObjSend aSelector to all objects in the collection, starting from the object at offset 0. For Stepstone compatibility. ICpak201 uses this.
-do:aBlockEvaluates aBlock for each element in the collection and returns self. aBlock must be a block taking one object (element) as argument; the return value of the block is ignored by this method.
Often, the Block would, as a side-effect, modify a variable, as in:
int count = 0; [contents do: { :what | if (what == anObject) count++; }];
-do:aBlockuntil:(BOOL*)flagEvaluates aBlock for each element in the collection, or until the variable pointed to by flag becomes true, and returns self. aBlock must be a block taking one object (element) as argument; the return value of the block is ignored by this method.
Typically the Block will modify the variable flag when some condition holds:
BOOL found = NO; [contents do:{ :what | if (what == findObject) found=YES;} until:&found]; if (found) { ... }
-find:anObjectReturns any element in the receiver which isEqual: to anObject. Otherwise, returns nil.
- (BOOL)contains:anObjectReturns YES if the receiver contains anObject. Otherwise, returns NO. Implementation is in terms of the receiver's find: method (which uses isEqual: and hash to decide whether the object is contained in the set).
- (BOOL)includes:anObjectThis method is equivalent to contains:.
- (unsigned)occurrencesOf:anObjectReturns 1 if anObject is in the receiver, otherwise returns 0. Implementation is in terms of the receiver's find: method (which uses isEqual: and hash).
-printOn:(IOD)aFilePrints a list of the objects in the set by sending each individual object a printOn: message. Returns the receiver.
-fileOutOn:aFilerWrites out non-nil objects in the Set on aFiler. Returns the receiver.
-fileInFrom:aFilerReads in objects from aFiler. Returns the receiver, which is a set that is not yet usable (until the set gets the awakeFrom: message).
-awakeFrom:aFilerRehashes the contents of the set, which was previously read from aFiler by the fileInFrom: method. The hash-values of the objects are possibly process or architecture dependent, so they are not stored on the filer. Rather, awakeFrom: recomputes the values.