Как управлять 2d массивом в Smalltalk? - PullRequest
4 голосов
/ 22 июня 2010

У меня есть список точек, и я должен выполнить операции эрозии / расширения. Мне нужен своего рода 2d-массив, но я не могу найти, как это сделать в VisualWorks (я знаю, что в Squeak есть класс Array2d, но я должен использовать VW).

Ответы [ 4 ]

4 голосов
/ 23 июня 2010

Многие реализации Smalltalk будут иметь некоторый класс Matrix, иногда оптимизированный, который будет иметь такие методы, как #rowAt: columnAt: (или для краткости #at: at:).

В GNU Smalltalk это в пакете DhbNumericMethods. Но сейчас он не оптимизирован.

3 голосов
/ 22 июня 2010

Используйте просто общий способ: массив массивов:

(Array new: xSize)
    at: 1 put: ((Array new: ySize) at: 1 put: aValue; at: 2 put: aValue; ...);
    at: 2 put: ((Array new: ySize) at: 1 put: aValue; at: 2 put: aValue; ...);
    ...
2 голосов
/ 30 января 2013

Вот еще один способ работы с двумерным массивом в Squeak (я использую версию 4.2).

test := Matrix new: 3.     "this defines a 3 x 3 array"
test at: 1 at: 1 put: 5.
test at: 1 at: 2 put: 6.
test at: 1 at: 3 put: 7.

и т. Д., И т. Д. AFAIK Вы можете делать только двумерные массивы таким образом, и они должны быть квадратной матрицей. Это хорошо сработало для проекта, над которым мы с сыном работаем над созданием игры судоку, ymmv. CHEERS!

2 голосов
/ 23 июня 2010

Если вы хотите, чтобы операции были эффективными, изучите класс VisualWorks Image, протокол «обработка изображений» и «обработка битов».Создайте свои собственные операции эрозии / расширения на основе примитивов там.

...