程序代写代做代考 Smalltalk Lecture 6

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