2013-04-06 2 views
1

Я новичок в Smalltalk и сейчас принимаю класс init. Одна из проблем, мы были назначены требует создания нового класса «HeavyMatrix», который называется так -Создайте класс Matrix, который можно инициализировать, не объявляя сначала размер матрицы

aMatrix := HeavyMatrix new. 

Обратите внимание, что не существует начальное назначение размера. Размер должен быть неопределенным при создании. Затем класс добавляет значения матрицы со следующим методом -

aMatrix setRow:1 column:2 value:7. 

Все значения в матрице, которые не были заявлены в этом пути по умолчанию 0. Новый класс HeavyMatrix не должен ничего другого подкласса чем объект (т. е. не матрица или массив). Могут ли любые Smalltalkers помочь мне? Есть и другие методы, которые должен содержать класс, но я думаю, что могу все понять, как только я могу инициализировать класс. Благодаря!

+0

Только что * * определяет размер? Будет ли момент времени, когда размер будет фиксированным, а затем сообщение 'setRow: column: value:' станет незаконным? – quamrana

+1

Экземпляры вашего класса могут иметь экземпляр var класса Matrix, изначально установленный в nil. Затем, когда ваш экземпляр получает сообщение setRow: column: value: он вычисляет размер требуемой матрицы, создает экземпляр, а затем устанавливает значение. Последующие вызовы setRow: column: value: может потребоваться создать новую матрицу, скопировать значения старой матрицы и затем сохранить новое значение. Не очень эффективный код, но он должен удовлетворять требованиям. –

+0

Нет, никогда не должно быть времени, когда setRow: column: value: становится незаконным. Я думал о создании матрицы в вызове метода setRow и затем копировании значений в новую матрицу. если этот метод был вызван и объявлен «незаконным». Действительно, не очень эффективно ... Я думал, возможно, используя расширяемую коллекцию, такую ​​как OrderedCollection? Что бы я ни использовал, кажется очень неудобным, если у этого tthing есть необходимый фиксированный размер для объявления. –

ответ

4

Что я могу предложить вам ... Прежде всего, вы можете использовать только упорядоченные коллекции и внутри setRow:column:value:, если размер текущего столбца меньше, чем требуется, чтобы добавить то, что отсутствует экземпляры OrderedCollection. То же самое с желаемым размером строки (add 0s). Реализация будет примерно такой:

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, в качестве ключа в словаре, чтобы вернуть значение, сохраненное в этой точке матрицы? Первый метод, который вы описали, будет включать создание и упорядоченное выделение упорядоченных образцов? Можете ли вы показать, как я могу инициализировать эти реализации без подкласса моего класса HeavyMatrix? Инициализация - это то, с чем у меня возникают проблемы, как новичок в smalltalk. Еще раз спасибо. –

+1

@WesField Я добавил код для моего первого предложения. Все еще не понимаю вашу проблему с подклассом – Uko

+0

Ваши изменения все объяснили. Ура! –