1

我是 Smalltalk 的新手,目前正在上课。我们被分配的一个问题需要创建一个新的“HeavyMatrix”类,它的调用方式是这样的——</p>

aMatrix := HeavyMatrix new.

请注意,没有初始大小分配。大小应该在创建时未确定。然后,该类使用以下方法将值添加到矩阵 -</p>

aMatrix setRow:1 column:2 value:7.

矩阵中所有未以这种方式声明的值默认为0。新的HeavyMatrix 类不应该继承Object 以外的任何东西(即不是Matrix 或Array)。任何 Smalltalkers 可以帮助我吗?该类必须包含一些其他方法,但我认为一旦能够初始化该类,我就可以计算出其他所有方法。谢谢!

4

1 回答 1

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描述的结构。请注意,只有当您的元素数量相对于矩阵本身的大小而言较少时,此矩阵才有效。但是,如果您要检查最简单的实现,例如在字典中存储坐标值数据,那么它将非常适合您:

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] 
于 2013-04-06T17:09:46.600 回答