In einigen meiner Scripts setze ich zum Sortieren von Listen eine QuickSort-Routine ein, welche ich vor Jahren in der AS-Users-Mailing-Liste aufgeschnappt habe. Bei einer geringen Anzahl von Elementen ist sie sehr schnell. Wenn die zu sortierenden Namen aber zu zahlreich sind, dann wird die Ausführung gebremst.
Kürzlich entwickelte ich ein Script, welches zu Beginn 207 Bilder-Namen sortieren musste. Weil dies recht lange dauerte, ersetzte ich die Standard-Sortierungs-Routine durch eine schnellere, welche ich letztes Jahr archiviert habe. Und die Ausführung wurde beschleunigt.
Wenn Objekte auf ein Droplet gezogen werden, ist das Resultat eine Liste, welche aber selten alphabetisch geordnet ist. Wenn die Reihenfolge des Abarbeitens wichtig ist, dann muss die Liste sortiert werden. Mit dem Befehl 'list folder' ist das Ergebnis besser sortiert, aber auch nicht zuverlässig. Ich verwende ihn deshalb in meinem Beispiel, und auch weil es so leichter auszuführen ist (ohne Verwandlung in ein Droplet).
Die Liste wird dem Sortierungs-Handler übergeben. Die weiteren Parameter sind die Zahl '1' (der Wert für den Zähler 'ctr') und die Anzahl der Elemente (= 'nItems'). Im Handler wird die Liste in ein Scriptobjekt gegeben und in der Folge wird nur dieses Objekt adressiert. Dadurch resultiert der Geschwindigkeitsgewinn.
Beim Abspielen wird der Anwender aufgefordert, einen Ordner auszuwählen. Im Ergebnisfenster erscheint die sortierte Liste des Ordnerinhaltes.
---
set fullPath to (choose folder) as string
set aList to list folder fullPath without invisibles
set nItems to count aList
if nItems > 1 then
set aList to quickSort(aList, 1, nItems)
end if
aList
on quickSort(a, L, R)
script
property aList : a
end script
tell result
set ctr to L
set n to R
set aRef to item L of its aList
repeat while ctr < n
repeat while (aRef < item n of its aList) and (ctr < n)
set n to n - 1
end repeat
if n is not ctr then
set item ctr of its aList to item n of its aList
set ctr to ctr + 1
end if
repeat while (aRef > item ctr of its aList) and (ctr < n)
set ctr to ctr + 1
end repeat
if n is not ctr then
set item n of its aList to item ctr of its aList
set n to n - 1
end if
end repeat
set item n of its aList to aRef
if L < n then
quickSort(its aList, L, n - 1)
end if
if R > ctr then
quickSort(its aList, ctr + 1, R)
return its aList
end if
end tell
end quickSort
---
Hans Haesler <hsa@ringier.ch>