我是Smalltalk的新手,目前正在上课。我们被分配的问题之一需要创建一个新的类“HeavyMatrix”,就像这样 -
aMatrix := HeavyMatrix new.
请注意,没有初始大小分配。尺寸应该在创造时不确定。然后,该类使用以下方法将值添加到矩阵 -
aMatrix setRow:1 column:2 value:7.
矩阵中未以这种方式声明的所有值都默认为0.新的Class HeavyMatrix不应该除了Object之外的其他任何子类(即不是Matrix或Array)。任何Smalltalkers可以帮助我吗?该类必须包含一些其他方法,但我认为一旦我能够初始化类,我就能算出其他所有方法。谢谢!
答案 0 :(得分:4)
我可以建议您...首先,如果当前列大小小于所需要的,则可以使用有序集合和setRow:column:value:
内部,而不是添加缺少OrderedCollection实例的内容。与所需的行大小相同(添加0)。实现将是这样的:
initialize
rows := OrderedCollection new
setRow: aRow column: aColumn value: aValue
| row |
rows size < aRow ifTrue: [
(aRow - rows size) timesRepeat: [rows add: OrderedCollection new]].
row := rows at: aRow.
row size < aColumn ifTrue: [
(aColumn - row size) timesRepeat: [row add: 0]].
row at: aColumn put: aValue
getRow: aRow column: aColumn
aRow <= rows size ifTrue: [
|row|
row := rows at: aRow.
aColumn <= rows size ifTrue: [^ row at: aColumn]].
^ 0
但更有效的方法是实现我认为的稀疏矩阵。你在wiki描述了很多结构。请注意,只有当元素数量少于矩阵本身的大小时,此矩阵才有效。但是,如果您检查最简单的实现,比如在字典中存储coords-value数据,那么它将为您提供很多帮助:
initialize
dict := Dictionary new
setRow: aRow column: aColumn value: aValue
dict at: aRow@aColumn put: aValue
getRow: aRow column: aColumn
dict at: aRow@aColumn ifAbsent: [0]