2013-04-06 61 views
1

我是Smalltalk的新手,目前正在接受一个类的初始化。其中一个我们被分配的问题,需要创建一个新的类“HeavyMatrix”,被称为是这样 -创建一个矩阵类,可以在未声明矩阵大小的情况下进行初始化

aMatrix := HeavyMatrix new. 

注意,没有初始大小分配。创建时大小应该是不确定的。然后,类增加值以下方法矩阵 -

aMatrix setRow:1 column:2 value:7. 

所有的矩阵还没有被宣布以这种方式默认为0值新的类HeavyMatrix不应该继承以外的任何比对象(即不是矩阵或阵列)。任何Smalltalkers能帮助我吗?还有其他一些类必须包含的方法,但我认为一旦我能够初始化类,我就可以确定其他所有方法。谢谢!

+0

究竟是什么*不*确定的大小?会有一个时间点的大小是固定的,然后消息'setRow:column:value:'变得非法? – quamrana 2013-04-06 15:40:15

+1

您的类的实例可能有一个Matrix类的实例var,最初设置为nil。然后当你的实例收到一条setRow:column:value的消息时,它会计算它需要的Matrix的大小,实例化它,然后设置它的值。随后调用setRow:column:value:可能需要您创建一个新的Matrix,复制旧Matrix的值,然后存储新值。代码效率不高,但应该满足要求。 – 2013-04-06 16:21:28

+0

不,不应该有一次,当setRow:column:value:成为非法的时候。我想在setRow方法调用中创建矩阵,然后将这些值复制到一个新矩阵中。如果该方法被调用并宣布为“非法”。确实不是很有效率......我想也许使用一个可扩展的集合,如OrderedCollection?无论我使用什么东西,如果这件东西具有必要的固定大小来声明,似乎非常不方便。 – 2013-04-06 16:30:32

回答

4

我能给你什么建议...首先,如果当前列大小比添加丢失OrderedCollection实例所需的列大小要小,那么您可以只使用有序集合并在setRow:column:value:之内。与期望的行大小相同(添加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: [email protected] put: aValue 

getRow: aRow column: aColumn 
    dict at: [email protected] ifAbsent: [0] 
+0

谢谢你的帮助。所以,如果我正确理解你,你建议用一个像i @ j这样的点作为字典中的关键字,以返回矩阵中那个点上存储的值。 您描述的第一种方法将涉及OrderedCollections的制作和OrderedCollection?你能否展示我如何初始化这些实现而不继承我的HeavyMatrix类?初始化是我在Smalltalk中作为初学者遇到的最大麻烦。再次感谢。 – 2013-04-07 06:07:12

+1

@WesField我为我的第一个建议添加了一些代码。仍然不明白你的问题与子类 – Uko 2013-04-07 10:20:48

+0

你的编辑解释了一切。干杯! – 2013-04-07 11:15:24