2013-04-06 39 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