Usage
Basic Usage
- constructor method (make, make_with ) を使って、SortEngine のインスタンスを作る
- 必要があれば、ソート順序を設定します。デフォルトは昇順です。
- 1次元リストのソートには、instance method の sort_list を引数に与える。
- 引数に与えた、リストそのものがソートされます。sort_list からの返り値は、引数に与えたリストと同じ物です。
use SortEngine : script "SortEngine"
set a_list to {5, 7, 1, 9, 3, 4}
tell (make SortEngine)
log sort_list(a_list)
set a_sorter to it
end tell
log a_list
tell a_sorter
set_ascending(false)
log sort_list(a_list)
end tell
Table Sort
2次元のリストを、その中の一つの列に従ってすべてのリストをソートすることができます。2次元リストをソートする時には、sort_list の代わりに、sort_table に 2次元リストと、ソート順序を決定するリストのインデックスを与えます。
use SortEngine : script "SortEngine"
set a_list2d to {{"a", "b", "c"}, {"d", "e", "f"}, {3, 2, 1}}
tell (make SortEngine)
sort_table(a_list2d, -1)
end tell
Custom Comparator
デフォルトの状態では、AppleScript の比較演算子で扱える値しかソートできません。つまり、数値と文字列のリストしかソートできません。それ以外の値、例えば list や record、script object をソートするときは、その大小関係を定義する script object (comparator script) を与える必要があります。
comparator script は次の仕様を満たしている必要があります。
- 二つの引数をとる do ハンドラ持っている。
- do ハンドラは、最初の引数と二つ目の引数を比較し、それぞれの場合に対応して次の値を返す。
- 1 : 最初の引数 > 二つ目の引数
- 0 : 最初の引数 = 二つ目の引数
- -1 : 最初の引数 < 二つ目の引数
comparator script は、construct method make_with でインスタンスの生成の際に与えるか、instance method set_comparator で instance に設定することができます。
次のサンプルは、二つの要素からなるリストの要素からなるリストをソートするスクリプトです。リストの最初の要素で大小関係が判定できなければ、二つ目の要素で大小関係を判定します。
use SortEngine : script "SortEngine"
script ListComparator
property parent : SortEngine's base_comparator()
property _compare_order : {1, 2}
on do(a_first, a_second)
repeat with ith from 1 to length of my _compare_order
set an_index to item ith of my _compare_order
set a_result to continue do(item an_index of a_first, item an_index of a_second)
if a_result is not 0 then
exit repeat
end if
end repeat
return a_result
end do
end script
set a_list to {{2, 2}, {1, 2}, {1, 1}, {2, 1}}
tell SortEngine's make_with({comparator:ListComparator})
sort_list(a_list)
end tell
Quick Sort vs Bubble Sort
SortEngine は quick sort と bubble sort のアルゴリズムを内蔵しています。デフォルトの状態では、quick sort が使用されてます。
一般的に、quick sort は bubble sort よりかなり早いです。しかし、quick sort は安定ソートではありません。どういうことかというと次のサンプルを見てください。ソート前のリストは、二つ目のリストをキーとしてソートされています。この2次元リストを最初のリストをキーにしてソートすると、quick sort の場合は、同等な値の順序がソート前後で入れ替わります。例えば、"a" の値の順序が入れ替わることがあります。一方、bubble sort は同等な値の順序は保証されます。用途に応じて使い分けてください。
use SortEngine : script "SortEngine"
set a_list to {{"c", "a", "b", "a", "c", "b", "a"}, {1, 1, 1, 2, 2, 2, 3}}
tell SortEngine's make_with({sorter:"quick"})
log sort_table(a_list, 1)
end tell
set a_list to {{"c", "a", "b", "a", "c", "b", "a"}, {1, 1, 1, 2, 2, 2, 3}}
tell SortEngine's make_with({sorter:"bubble"})
log sort_table(a_list, 1)
end tell