[Squeak] been dazed by SortedCollection
arning at charm.net
Sun Aug 30 05:15:24 UTC 1998
On Sun, 30 Aug 1998 13:28:27 +0900 Satoshi NISHIHARA <nishis at urban.ne.jp> wrote:
>I've been dazed and confused ((C)Led Zeppelin) by SortedCollection.
> | collection |
> collection := SortedCollection new.
> collection sortBlock: [:element1 :element2 | element1 > element2].
> 1 to: 10 do: [:i | collection add: i].
> Transcript cr; show: (collection copyFrom: 1 to: 5) printString
>Got SortedCollection (6 7 8 9 10 ), although expected SortedCollection
>(10 9 8 7 6 ).
>I think that SortedCollection (6 7 8 9 10 ) has sortBlock: [:x :y | x <=
>y] (default) *not* [:x :y | x > y] (required). Is it right?
You are right about the new SortedCollection having the default sortBlock.
OrderedCollection>>copyFrom:to: creates the new collection with
self species new: endIndex + 1 - startIndex
This just gives you the same kind (with 2 exceptions) of collection you had before. It does NOT recognize what sortBlock the original had.
To get your code to work, you can:
1. Explicitly give the new collection a sortBlock as in
Transcript cr; show: ((collection copyFrom: 1 to: 5)
sortBlock: [:element1 :element2 | element1 > element2]) printString
2. Or, if you are not interested in the result actually being a SortedCollection,
Transcript cr; show: (collection asArray copyFrom: 1 to: 5) printString
3. Or you could reimplement #copyFrom:to: in SortedCollection to give the new collection the same sortBlock as the old one had:
copyFrom: startIndex to: endIndex
"Answer a copy of the receiver that contains elements from position
startIndex to endIndex, keeping the sortBlock from the receiver"
| targetCollection |
(targetCollection _ self species new: (endIndex + 1 - startIndex max: 0)) sortBlock: self sortBlock.
endIndex < startIndex ifTrue: [^targetCollection].
startIndex to: endIndex do: [:index | targetCollection add: (self at: index)].
More information about the Squeak-dev