Richard,

Can you explain me what you mean by "sortBlock is supposed to act like #<="?
Isn't it up to the developer to decide what the logic should be? I simply
used #<= because #> might not have been implemented for all relevant
classes, but would otherwise have chosen #> as a means to get the 'reversal'
of #<=.

Your solution is not resulting in the behaviour I would expect it. Adding
elements which are compared equally, but still have a different value, do
not get added in the same position. In the examples below I use
Associations, since it compares on the key only (for #<= comparison).

Consider a regular SortedCollection with default sortBlock (set explicitly):
| aCollection |
aCollection := SortedCollection sortBlock: [ :a :b | a <= b ].
{#k->'Some'. #k->'Value'. #k->'Or'. #k->'Other'} do: [ :each | aCollection
add: each ].
aCollection.
 "a SortedCollection(#k->'Some' #k->'Value' #k->'Or' #k->'Other')"

When I create a SortedCollection with your code's sortBlock reversed I get:
| aCollection |
aCollection := SortedCollection sortBlock: [ :a :b | b <= a ].
{#k->'Some'. #k->'Value'. #k->'Or'. #k->'Other'} do: [ :each | aCollection
add: each ].
aCollection.
 "a SortedCollection(#k->'Some' #k->'Value' #k->'Or' #k->'Other')"

The order of the result is the same in both situations. What I would expect
is the result you get from the sortBlock I suggested:
| aCollection |
aCollection := SortedCollection sortBlock: [ :a :b | (a <= b) not ].
{#k->'Some'. #k->'Value'. #k->'Or'. #k->'Other'} do: [ :each | aCollection
add: each ].
aCollection.
 "a SortedCollection(#k->'Other' #k->'Or' #k->'Value' #k->'Some')"

This last result is the reversal of the original result.

(side note)
IF in the above #addAll: was used instead of the repeated #add:, things
might be different again. Since the #addAll: implementation would on some
occasions (when size of receiver vs size of added elements is certain ratio)
add the elements at the end and then perform a #reSort. With values being
compared as equal, the order will be decided by the order they were added.
So the result of #addAll: depends on the collection sizes. This might not be
what a user would expect ;-).



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html

Reply via email to