Smalltalk Lecture 6
1
Queue in Collection hierarchy
Collection subclass: #Queue.
Queue instanceVariableNames: ‘list’.
Queue extend [ insert: key [
list addLast: key ]
“enqueue”
] ]
“dequeue” ifFalse: [ ^ list removeFirst ]
remove [
list isEmpty ifTrue: [ ^ nil ]
2
init and new
Queue extend [
display [ list do: [ 😡 | Transcript display: x; cr ] ]
init [ list := OrderedCollection new ] ]
Queue class extend [ new [ ^ super new init ]
]
3
Client code
q := Queue new.
q insert: 20; insert: 40; insert: 10; insert: 30. q display.
5 timesRepeat:
[ Transcript display: q remove; cr ].
20 40 10 30
20 40 10 30 nil
4
do:
Queue extend [
do: aBlock [ list do: aBlock ]
display [ self do: [ 😡 | Transcript display: x; cr ] ] ]
q := Queue new.
q insert: 20; insert: 40; insert: 10; insert: 30. q display.
20 40 10 30
5
collect:
Queue extend [
collect: aBlock [ “map”
^ Queue new list: (list collect: aBlock) ]
list: aList [ list := aList ] ]
r := q collect: [ 😡 | x*x ]. r display.
400
1600
100
900
6
select:
Queue extend [
select: aBlock [ “filter”
^ Queue new list: (list select: aBlock) ]
]
s := q select: [ 😡 | x>15 and: [x<35] ]. s display.
20 30
7
reject:
Queue extend [ reject: aBlock [
^ Queue new list: (list reject: aBlock) ]
]
t := q reject: [ :x | x>15 and: [x<35] ]. t display.
40 10
8
inject:into: and detect:ifNone: (inherited from Collection)
Transcript display: (q inject: 0 into: [ :a :b | a+b ]); cr. Transcript display: (q inject: 1 into: [ :a :b | a*b ]); cr.
Transcript display: (q detect: [ :x | x<15 ] ifNone: [99]); cr. Transcript display: (q detect: [ :x | x>25 ] ifNone: [99]); cr. Transcript display: (q detect: [ 😡 | x>50 ] ifNone: [99]); cr.
100 240000
10 40 99
9
BitSet class
Collection subclass: BitSet [ | arr |
init: n [
arr := Array new: n.
1 to: n do: [ :k | arr at: k put: false ]
]
init [ self init: 10 ]
size [ ^ arr size ]
display [ Transcript display: arr; cr ]
]
10
cardinality
BitSet extend [ cardinality [
|n|
n := 0.
1 to: self size do: [ :k | (arr at: k) ifTrue: [ n := n+1 ] ]. ^n
] ]
11
Client code
set := BitSet new init.
set display.
Transcript display: set cardinality; cr.
(false false false false false false false false false false ) 0
12
insert:
BitSet extend [ insert: x [
(self inRange: x)
ifTrue: [ arr at: x put: true ]
ifFalse: [ Transcript display: ‘Error: out of range’; cr ]
]
inRange: index [ ^ (1 <= index) and: [ index <= self size ] ] ]
13
Client code
1 to: set size by: 2 do: [ :k | set insert: k ]. set display.
Transcript display: set cardinality; cr.
(true false true false true false true false true false ) 5
14
remove:
BitSet extend [ remove: x [
(self inRange: x)
ifTrue: [ arr at: x put: false ]
ifFalse: [ Transcript display: 'Error: out of range'; cr ]
] ]
15
Client code
1 to: set size by: 3 do: [ :k | set remove: k ]. set display.
Transcript display: set cardinality; cr.
(false false true false true false false false true false ) 3
16
member:
BitSet extend [ member: x [
(self inRange: x) ifTrue: [^arrat:x] ifFalse: [ ^ false ]
] ]
17
Client code
1 to: set size do: [ :k |
Transcript display: k; space; display: (set member: k); cr
].
1 false
2 false
3 true
4 false
5 true
6 false
7 false
8 false
9 true
10 false
18
do: and inject:into:
BitSet extend [
do: aBlock [ 1 to: arr size do:
[ :k | (arr at: k) ifTrue: [ aBlock value: k ] ]
] ]
set do: [ :x | Transcript display: x; cr ]. 359
Transcript display: (set inject: 0 into: [ :a :b | a+b ]); cr. Transcript display: (set inject: 1 into: [ :a :b | a*b ]); cr.
19
17 135