SortedCollection.st
author claus
Sun, 16 Jan 1994 04:47:41 +0100
changeset 44 b262907c93ea
parent 32 ee1a621c696c
child 62 e1b4369c61fb
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
OrderedCollection subclass:#SortedCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
         instanceVariableNames:'sortBlock'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
         classVariableNames:'DefaultSortBlock'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
         poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
         category:'Collections-Ordered'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
SortedCollection comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1993 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
I keep my elements sorted. The sort order is defined by a sortblock,
2
claus
parents: 1
diff changeset
    26
a two-argument block which, when given two elements of the collection, 
claus
parents: 1
diff changeset
    27
returns true if the element given as first arg has to come before the 
claus
parents: 1
diff changeset
    28
element given as second arg.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
Thus a sortBlock of [:a :b | a < b] defines ascending sort-order,
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
while [:a :b | a > b] defines descening order.
2
claus
parents: 1
diff changeset
    31
The default sortBlock for SortedCollections is the first one.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
44
b262907c93ea *** empty log message ***
claus
parents: 32
diff changeset
    33
$Header: /cvs/stx/stx/libbasic/SortedCollection.st,v 1.6 1994-01-16 03:46:34 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
!SortedCollection class methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
    DefaultSortBlock := [:a :b | a < b ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
    "SortedCollection initialize"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
!SortedCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
new
2
claus
parents: 1
diff changeset
    47
    "return a new sortedCollection, the sorting is done using
claus
parents: 1
diff changeset
    48
     a compare for a > b, in ascending order"
claus
parents: 1
diff changeset
    49
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
    ^ super new setSortBlock:DefaultSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
new:size
2
claus
parents: 1
diff changeset
    54
    "return a new sortedCollection with preallocated size.
claus
parents: 1
diff changeset
    55
     The sorting is done using a compare for a > b, in ascending order"
claus
parents: 1
diff changeset
    56
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
    ^ (super new:size) setSortBlock:DefaultSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
sortBlock:aBlock
2
claus
parents: 1
diff changeset
    61
    "set the sort-block"
claus
parents: 1
diff changeset
    62
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
    ^ super new setSortBlock:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
!SortedCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
addFirst:anObject
2
claus
parents: 1
diff changeset
    69
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
    70
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
addLast:anObject
2
claus
parents: 1
diff changeset
    75
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
    76
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
at:index put:anObject
2
claus
parents: 1
diff changeset
    81
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
    82
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
add:newObject after:oldObject
2
claus
parents: 1
diff changeset
    87
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
    88
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
add:newObject before:oldObject
2
claus
parents: 1
diff changeset
    93
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
    94
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
addAll:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
    "add all elements of the argument, aCollection to the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
     receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    |mySize    "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
     otherSize "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
     dstIndex  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
     newSize newContents|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
    "if aCollection is bigger than a threshhold, its faster
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
     to add all and resort - question: what is a good treshhold ?"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
    otherSize := aCollection size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
    ((mySize == 0) or:[otherSize > 5]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
        newSize := mySize + otherSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
        newContents := Array new:newSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
        newContents replaceFrom:1 to:mySize with:contentsArray startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
        (aCollection isKindOf:SequenceableCollection) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
            "maybe we can do it in one big move"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
            newContents replaceFrom:(mySize + 1) to:newSize with:aCollection startingAt:1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
            dstIndex := mySize + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
            aCollection do:[:element |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
                newContents at:dstIndex put:element.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
                dstIndex := dstIndex + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
        firstIndex := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
        lastIndex := newSize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
        contentsArray := newContents.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
        contentsArray sort:sortBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
    super addAll:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
    "#(7 3 9 10 99) asSortedCollection addAll:#(77 0 1 16 5)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
add:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
    "add the argument, anObject at the proper place in the
2
claus
parents: 1
diff changeset
   139
     receiver. Returns the argument, anObject."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   141
    |index|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   143
    lastIndex < firstIndex "i.e. self size == 0" ifTrue:[
13
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   144
        super add:anObject
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
        index := self findIndexFor:anObject. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
        self makeRoomAtIndex:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
        contentsArray at:index put:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    ^ anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
13
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   153
!SortedCollection methodsFor:'converting'!
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   154
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   155
asSortedCollection
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   156
    "return the receiver as a sorted collection"
13
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   157
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   158
    "could be an instance of a subclass..."
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   159
    self class == SortedCollection ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   160
        ^ self
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   161
    ].
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   162
    ^ super asSortedCollection
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   163
! !
62303f84ff5f *** empty log message ***
claus
parents: 3
diff changeset
   164
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
!SortedCollection methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
includes:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    "return true, if the argument, anObject is in the collection.
2
claus
parents: 1
diff changeset
   169
     Redefined, since due to beeing sorted, the inclusion check can
claus
parents: 1
diff changeset
   170
     be done with log-n compares i.e. much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   172
    |index "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
    index := self findIndexFor:anObject.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   175
    ((index < firstIndex) or:[index > lastIndex]) ifTrue:[^ false].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   176
    ^ (contentsArray at:index) = anObject
2
claus
parents: 1
diff changeset
   177
claus
parents: 1
diff changeset
   178
    "#(7 3 9 10 99) asSortedCollection includes:50"
claus
parents: 1
diff changeset
   179
    "#(7 3 9 10 99) asSortedCollection includes:10"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
occurrencesOf:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    "return how many times the argument, anObject is in the collection.
2
claus
parents: 1
diff changeset
   184
     Redefined, since due to beeing sorted, the range of checked objects
claus
parents: 1
diff changeset
   185
     can be limited i.e. it can be done much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
    |index      "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
     tally      "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
    index := self findIndexFor:anObject.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   191
    ((index < firstIndex) or:[index > lastIndex]) ifTrue:[^ 0].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   192
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    tally := 0.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   194
    [(index <= lastIndex) and:[(contentsArray at:index) = anObject]] whileTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
        tally := tally + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    ^ tally
2
claus
parents: 1
diff changeset
   199
claus
parents: 1
diff changeset
   200
    "#(7 3 9 10 99) asSortedCollection occurrencesOf:50"
claus
parents: 1
diff changeset
   201
    "#(7 3 9 10 99) asSortedCollection occurrencesOf:10"
claus
parents: 1
diff changeset
   202
    "#(7 10 3 10 9 10 10 99) asSortedCollection occurrencesOf:10"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
!SortedCollection methodsFor:'instance protocol'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    "return the block used for sorting"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    ^ sortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
sortBlock:aSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
    "change the sort criteria for a sorted collection, resort the elements of 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
    the collection, and return the receiver. The argument, aSortBlock must
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    be a two-argument block which returns true if its arg1 has to come before
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
    its arg2 in the collection."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    sortBlock := aSortBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
    lastIndex > firstIndex ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
        contentsArray quickSortFrom:firstIndex to:lastIndex sortBlock:aSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
    "#(9 8 7 6 5 4 3) asSortedCollection"
2
claus
parents: 1
diff changeset
   225
    "#(9 8 7 6 5 4 3) asSortedCollection sortBlock:[:a : b | a < b]"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
    "#(9 8 7 6 5 4 3) asSortedCollection sortBlock:[:a : b | a > b]"
2
claus
parents: 1
diff changeset
   227
    "#($f $G $z $Y $o $H) asSortedCollection"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
    "#($f $G $z $Y $o $H) asSortedCollection sortBlock:[:a : b | a asUppercase < b asUppercase]"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
!SortedCollection methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
setSortBlock: aSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
    "set the sortblock without resorting - private only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
    sortBlock := aSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
findIndexFor:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
    "search the index at which to insert anObject. Can also be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
     to search for an existing element by checking if the element at
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   242
     the returned index is the one we look for.
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   243
     The returned index is a physical one, for accessing contentsArray."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
    |low    "{ Class: SmallInteger}"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
     high   "{ Class: SmallInteger}"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
     middle "{ Class: SmallInteger}"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
     element|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    low := firstIndex.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
    high := lastIndex.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
    [low <= high] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
        middle := (low + high) // 2.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   254
        element := contentsArray at:middle.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
        (sortBlock value:element value:anObject) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
            "middleelement is smaller than object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
            low := middle + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
            high := middle - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
    ^ low
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
2
claus
parents: 1
diff changeset
   264
    "#(1 2 3 4 7 99 1313 981989 898989898) asSortedCollection findIndexFor:50"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
! !