On Sun, 30 Aug 1998 13:28:27 +0900 Satoshi NISHIHARA nishis@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)]. ^ targetCollection
Cheers, Bob
squeak-dev@lists.squeakfoundation.org