Кратък отговор:
Не е нужно.
За да сортирате масив, просто му изпратете съобщението #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