December 11, 2019

The Protocol of OrderedCollection

 

This is an illustration of OrderedCollection instance topEarners.

1 2 3 4 5 6
'Bill Crynge' 'Sian O''Driscoll' 'Bryan Walker' 'Herve Constantine' 'Phillipa Reynolds' 'Terry Cook'

 

However, the following year, another artist, Mark Wolfe, exhibiting for the first time in three years, pulls out all the stops and secures number one spot. The gallery is forced to revise topEarners

topEarners addFirst: 'Mark Wolfe' which returns the argument and the revised collection is now textually represented as
OrderedCollection ('Mark Wolfe' 'Bill Crynge' 'Sian O''Driscoll' 'Bryan Walker' 'Herve Constantine' 'Phillipa Reynolds' 'Terry Cook')

Cordelia's reservations about Bill Crynge are partially justified by the final cost of rebuilding the gallery after his last show. Crynge barely makes the cut, but still holds on to his place in topEarners. How can the collection be revised?
topEarners addLast: 'Bill Crynge' will place Bill at the end of the line, but the result will be two occurences of the string'Bill Crynge', proving that you can have duplicates in an ordered collection. The following code will put Bill in his rightful place and avoid this problem

topEarners remove: 'Bill Crynge';
           add: 'Bill Crynge' after: 'Terry Cook'

The message answer is 'Bill Crynge'

topEarners is now textually represented as
OrderedCollection ('Mark Wolfe' 'Sian O''Driscoll' 'Bryan Walker' 'Herve Constantine' 'Phillipa Reynolds' 'Terry Cook' 'Bill Crynge')

Care has to be taken when using remove:
it is safer to use remove:ifAbsent:

Further revision is needed as one more artist has turned paint into gold. In with a bullet at number five is RCA graduate Will James. There are several ways of adding him to Cordelia's chosen few.

topEarners add: 'Will James' before: 'Phillipa Reynolds' answering with 'Will James'
or
topEarners add: 'Will James' beforeIndex: 5 answers with the updated collection, the representation of which is
OrderedCollection ('Mark Wolfe' 'Sian O''Driscoll' 'Bryan Walker' 'Herve Constantine' 'Will James' 'Phillipa Reynolds' 'Terry Cook' 'Bill Crynge')

If you know the index of an element that you wish to update then at:put: can be used as in
topEarners at: 8 put: 'Claudia Beckmann' answering with 'Claudia Beckmann' the collection is now textually represented as
OrderedCollection ('Mark Wolfe' 'Sian O''Driscoll' 'Bryan Walker' 'Herve Constantine' 'Will James' 'Phillipa Reynolds' 'Terry Cook' 'Claudia Beckmann')

topEarners at: 1 answers with 'Mark Wolfe' as does

topEarners first

topEarners last answers with 'Claudia Beckmann'

Messages such as size, isEmpty, includes: are all implemented as expected

The gallery has another collection in its system and records the type of work it sells. The added string elements are 'Painting', 'Print', 'Drawing', 'Sculpture' and 'Installation'.

salesTypeCollection := OrderedCollection new.

After each sale the collection grows with the addition of messages like
salesTypeCollection add: 'Painting' and so on. At any stage the number of sales of any kind of work can be counted by a looping do: message. Again we need to initialise a temporary variable count to zero, then loop through the collection, testing each element in turn for equality with the element that we are searching for. For example

|count|
count := 0.
salesTypeCollection do: [:element| (element = 'Painting')
                                       ifTrue: [count := count + 1]].
^count

So far, all these elements have been strings, but they could be any object.

Now consider a different scenario.

Next page » The exhibition collection

Previous page « OrderedCollection

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Up to top of page