Synopsis|SortEngine Reference

Usage

Basic Usage

  1. constructor method (make, make_with ) を使って、SortEngine のインスタンスを作る
  2. 必要があれば、ソート順序を設定します。デフォルトは昇順です。
    • 降順でソートしたいときは、set_ascending(false) をインスタンスに送ります。
  3. 1次元リストのソートには、instance method の sort_list を引数に与える。
  4. 引数に与えた、リストそのものがソートされます。sort_list からの返り値は、引数に与えたリストと同じ物です。

Table Sort

2次元のリストを、その中の一つの列に従ってすべてのリストをソートすることができます。2次元リストをソートする時には、sort_list の代わりに、sort_table に 2次元リストと、ソート順序を決定するリストのインデックスを与えます。

use SortEngine : script "SortEngine"

set a_sorter to make SortEngine
set a_list2d to {{"a", "b", "c"}, {"d", "e", "f"}, {3, 2, 1}}
a_sorter's sort_table(a_list2d, -1)
--result : {{"c", "b", "a"}, {"f", "e", "d"}, {1, 2, 3}}
use SortEngine : script "SortEngine"

(* sort a list *)
set a_list to {5, 7, 1, 9, 3, 4}
set a_sorter to make SortEngine
log a_sorter's sort_list(a_list)
--result :{1, 3, 4, 5, 7, 9}
log a_list
-- result : {1, 3, 4, 5, 7, 9}

(* reverse sort *)
a_sorter's set_ascending(false)
log a_sorter's sort_list(a_list)
--result : {9, 7, 5, 4, 3, 1}

Custom Comparator

デフォルトの状態では、AppleScript の比較演算子で扱える値しかソートできません。つまり、数値と文字列のリストしかソートできません。それ以外の値、例えば list や record、script object をソートするときは、その大小関係を定義する script object (comparator script) を与える必要があります。

comparator script は次の仕様を満たしている必要があります。

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}}
set a_sorter to SortEngine's make_with({comparator:ListComparator})
a_sorter's sort_list(a_list)
--result :{{1, 1}, {1, 2}, {2, 1}, {2, 2}}

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"

(* quick sort (default) *)
set a_sorter to SortEngine's make_with({sorter:"quick"})
set a_list to {{"c", "a", "b", "a", "c", "b", "a"}, {1, 1, 1, 2, 2, 2, 3}}
log a_sorter's sort_table(a_list, 1)
-- result :{{a, a, a, b, b, c, c}, {3, 1, 2, 1, 2, 2, 1}}

(* bubble sort *)
set a_sorter to SortEngine's make_with({sorter:"bubble"})
set a_list to {{"c", "a", "b", "a", "c", "b", "a"}, {1, 1, 1, 2, 2, 2, 3}}
log a_sorter's sort_table(a_list, 1)
-- result : {{a, a, a, b, b, c, c}, {1, 2, 3, 1, 2, 1, 2}}
Synopsis|SortEngine Reference