[GastForen Programmierung/Entwicklung AppleScript Listen schneller sortieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Listen schneller sortieren

Hans Haesler
  
Beiträge gesamt: 5826

26. Sep 2003, 11:05
Beitrag # 1 von 1
Bewertung:
(431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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>
X