並び順を定義したリスト(インデックスリスト)にもとづいてソートを行うAppleScriptです。
テストデータにあるように、都道府県別のリストを処理する際に、結果を北から南へと並べたいというニーズを満たすために、その場で作ったものでしかありません。都道府県別なので重複データが存在しないことが前提です。
一応、リストを扱うための高速化処理を行なっているので、速度についてはそれほど困ることはないと思われます。
# 書籍「AppleScript最新リファレンス」からのリンクURLがBlog消失後に修復されていなかったので、再掲載しました。書籍側もリンクURLを修正したものを近日中にアップします
AppleScript名:並び順をインデックスリストで指定してソート |
–並び順を指定するインデックスリスト(この順番にソート対象データを並べ替える) set indexList to {"北海道", "青森県", "岩手県", "秋田県", "宮城県", "山形県", "福島県", "新潟県", "富山県", "石川県", "福井県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "長野県", "山梨県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "兵庫県", "大阪府", "奈良県", "和歌山県", "島根県", "岡山県", "鳥取県", "広島県", "山口県", "香川県", "徳島県", "愛媛県", "高知県", "福岡県", "大分県", "佐賀県", "長崎県", "宮崎県", "熊本県", "鹿児島県", "沖縄県"} –ソート対象データ set aList to {{"東京都", 301}, {"神奈川県", 98}, {"大阪府", 90}, {"千葉県", 60}, {"埼玉県", 55}, {"北海道", 40}, {"愛知県", 40}, {"京都府", 40}, {"兵庫県", 40}, {"福岡県", 30}, {"静岡県", 20}, {"広島県", 20}, {"茨城県", 20}, {"宮城県", 16}, {"長野県", 15}, {"福島県", 12}, {"新潟県", 11}, {"滋賀県", 10}, {"岐阜県", 10}, {"群馬県", 10}, {"石川県", 10}, {"熊本県", 9}, {"岡山県", 9}, {"福井県", 7}, {"青森県", 7}, {"秋田県", 6}, {"愛媛県", 6}, {"和歌山県", 6}, {"奈良県", 5}, {"三重県", 5}, {"沖縄県", 5}, {"岩手県", 5}, {"大分県", 4}, {"鹿児島県", 4}, {"宮崎県", 4}, {"栃木県", 3}, {"香川県", 3}, {"山形県", 3}, {"富山県", 2}, {"山梨県", 2}, {"長崎県", 2}, {"徳島県", 2}, {"島根県", 2}, {"鳥取県", 1}, {"高知県", 1}, {"山口県", 1}} set bList to sortItemByIndexList(aList, indexList, 1, 2) of me –> {{"北海道", 40}, {"青森県", 7}, {"岩手県", 5}, {"秋田県", 6}, {"宮城県", 16}, {"山形県", 3}, {"福島県", 12}, {"新潟県", 11}, {"富山県", 2}, {"石川県", 10}, {"福井県", 7}, {"茨城県", 20}, {"栃木県", 3}, {"群馬県", 10}, {"埼玉県", 55}, {"千葉県", 60}, {"東京都", 301}, {"神奈川県", 98}, {"長野県", 15}, {"山梨県", 2}, {"岐阜県", 10}, {"静岡県", 20}, {"愛知県", 40}, {"三重県", 5}, {"滋賀県", 10}, {"京都府", 40}, {"兵庫県", 40}, {"大阪府", 90}, {"奈良県", 5}, {"和歌山県", 6}, {"島根県", 2}, {"岡山県", 9}, {"鳥取県", 1}, {"広島県", 20}, {"山口県", 1}, {"香川県", 3}, {"徳島県", 2}, {"愛媛県", 6}, {"高知県", 1}, {"福岡県", 30}, {"大分県", 4}, {"佐賀県", 0}, {"長崎県", 2}, {"宮崎県", 4}, {"熊本県", 9}, {"鹿児島県", 4}, {"沖縄県", 5}} –並び順をインデックスリストで指定してソート –パラメータ: (1) aList=ソート元リスト ({{"name1", number1}, {"name2", number2}……} )、 – (2) indexList=ソート順指定用インデックスリスト、 – (3) itemNo=並べ替え対象アイテム番号(ソート元リスト内の各リスト要素内のソートキーになるアイテムの番号) – (4) nohitItem=インデックス項目がソート元リストに対してヒットしなかった場合の、件数0を入れるアイテム番号 –エラー: エラー時にはfalseを返す on sortItemByIndexList(aList, indexList, itemNo, nohitItem) –処理高速化のためにハンドラ内部にScript Objectを宣言してデータアクセス script sortItemByIndexListObj property indexListSpd : indexList property aListSpd : aList end script –パラメータのエラーチェック set tmpItem to contents of first item of aList set tmpLen to length of tmpItem –itemNoのエラーチェック if (itemNo < 1) or (itemNo > tmpLen) then return false –nohitItemのエラーチェック if (nohitItem < 1) or (nohitItem > tmpLen) then return false –itemNoとnohitItemが衝突していないかチェック if itemNo = nohitItem then return false –処理本体 set outList to {} repeat with i in indexListSpd of sortItemByIndexListObj set j to contents of i set hitF to false repeat with ii in aListSpd of sortItemByIndexListObj set targItem to contents of item itemNo of ii if targItem = j then set the end of outList to contents of ii set hitF to true exit repeat end if end repeat –合致するデータがなかった場合の対応 if hitF = false then set tmpList to {} repeat nohitItem times set the end of tmpList to "" end repeat set item itemNo of tmpList to j set item nohitItem of tmpList to 0 set the end of outList to tmpList end if end repeat outList end sortItemByIndexList |
More from my site
(Visited 90 times, 1 visits today)