Короткий ответ:
Вам не нужно.
Чтобы отсортировать массив, просто отправьте ему сообщение #asSortedCollection
. Например, проверьте это в рабочей области:
#(7 2 8 5) asSortedCollection
Длинный ответ:
Поскольку я предполагаю, что вы хотите увидеть, как вы будете реализовывать эквивалент вашего Java-кода в Smalltalk, если вам действительно придется, вот относительно "буквальный перевод", который вы можете протестировать в рабочее пространство (проверено в Pharo, должно работать и в Squeak):
| someNumbers |
someNumbers := #(7 2 8 5) copy. "See comments below for an explanation."
someNumbers size to: 1 by: -1 do: [:eachOuterIndex |
| indexOfSmallest swapValue |
indexOfSmallest := 1.
1 to: eachOuterIndex do: [:eachInnerIndex |
(someNumbers at: eachInnerIndex) < (someNumbers at: indexOfSmallest)
ifTrue: [ indexOfSmallest := eachInnerIndex ]
].
swapValue := someNumbers at: indexOfSmallest.
someNumbers at: indexOfSmallest put: (someNumbers at: eachOuterIndex).
someNumbers at: eachOuterIndex put: swapValue.
].
^someNumbers
Очевидно, есть несколько изменений по сравнению с вашей версией, например, использование явного именования, которое является одним из отличительных признаков Smalltalk (в частности, indexOfSmallest
должно быть понятнее, чем first
, что вводит в заблуждение, поскольку это не обязательно первый индекс), и уменьшение область переменных, которые вы назвали first
и temp
). См. Ответ @Leandro для версии, в которой используются ваши собственные имена переменных, если у вас возникли проблемы с «переводом».
Если бы код жил в методе, я бы, вероятно, поместил его в иерархию SequenceableCollection
(или, может быть, вы хотели бы добавить туда свой подкласс, если хотите переопределить другое поведение), и его начало могло бы выглядеть что-то вроде этого:
copySortedDescending
"Answer a copy of the receiver, sorted in descending order."
| copy |
copy := self copy.
copy size to: 1 by: -1 do: [:eachOuterIndex |
"... and so on..."
].
^copy
Опять же, обратите внимание, что я намеренно меняю имя, потому что я не думаю, что selectionSort
— это описательное имя того, что делает метод, и я бы не стал использовать коллекцию в качестве аргумента для метода, живущего где-то еще — знание как сделать сортировку принадлежит самой коллекции.
Я уверен, что вы могли бы очень легко придумать лучший ответ. Например, вы можете попробовать отправить экземпляру SequenceableCollection
сообщение sort:
и передать блок сортировки в качестве аргумента, в котором вы можете указать, как вы хотите, чтобы ваши элементы были отсортированы.
person
Amos M. Carpenter
schedule
30.04.2015