LlListSort/ja
From Second Life Wiki
仕様
ソートには遅いバブル ソートが使われています。
ソートの順番にはデータ型が関係します。
それぞれのデータ型で個別にソートが行なわれ、データ型の順番は保持されます。
llListSort([1, "C", 3, "A", 2, "B"], 1, TRUE) returns [1, "A", 2, "B", 3, "C"] llListSort([1, 3, 2, "C", "A", "B"], 1, TRUE) returns [1, 2, 3, "A", "B", "C"] llListSort([1, "C", 3, "A", 2, "B"], 2, TRUE) returns [1, "C", 2, "B", 3, "A"]
警告
- バブル ソートは計算時間が最悪の場合 O(N*N) となるソート アルゴリズムです。リンデン ラボがなぜWikipedia:ヒープソートやWikipedia:マージソートのような O(N*log(N)) になるソート アルゴリズムを採らなかったのか分かりません。この関数の改善に関する議論が JIRA にありますので、ここから投票してください。
例
list numbers = [3, "three", 2, "two", 1, "one"]; default { state_entry() { llOwnerSay(llDumpList2String(numbers, ",")); // Object: 3,three,2,two,1,one numbers = llListSort(numbers, 2, TRUE); llOwnerSay(llDumpList2String(numbers, ",")); // Object: 1,one,2,two,3,three } }
ノート
データ型
この関数は実際、同じデータ型の要素についてのみ有効です。複数のデータ型を要素に持つリストにも使用はできます -- 正確に言うと、スクリプトの動作には支障がありません -- が、戻り値は大概無意味なものです。
list mylist = ["brown", <0.000000, 0.000000, 0.000000>, "house", 17.005, 100, "cat", <3.000000, 3.000000, 3.000000>, 39]; list tmplist = llListSort(mylist,1,TRUE); llSay(0, llList2CSV(tmplist));
これは以下のようにチャットで返します:
brown, <0.000000, 0.000000, 0.000000>, cat, 17.004999, 39, house, <3.000000, 3.000000, 3.000000>, 100
戻り値の利用
ソート対象となった元のリストは変更されない事に注意してください。ソート結果は新しい別の配列として返されます。従って (戻り値を直接処理するのでないならば) 戻り値を変数に収めることが重要です。
llListSort(myList,1,TRUE); // 無駄な事をしましたね。戻り値を保存しなくては。<br /> list newlist = llListSort(myList,1,TRUE);//そう、戻り値を保存しました。<br /> llSay(0,llList2CSV(llSortList(myList,1,TRUE))); //戻り値を直接扱うので、保存は不要です。
Stride パラメタ
殆どの場合、リストの各要素を単純にソートするため "飛び石間隔" を 1 (あるいは 0 でも同様) に設定する事になるでしょう。(ただし飛び石リストを扱う場合は、それに関する後述の項を参照してください)
ソート順
引数 ascending に TRUE を設定すると、昇順にソートされたリストが返されます。
昇順の例: ["Apples", "Bananas", "Oranges"]
引数 ascending に FALSE を設定すると、降順にソートされたリストが返されます。
降順の例: ["Oranges", "Bananas", "Apples"]
飛び石リストのソート
飛び石リストで関連データを一続きのまま保持したい場合、単純にソートするとデータが台無しになってしまいます。
list demographics = ["John Adams", "male", "2007-06-22", "Shirley Bassey", "female", "2005-11-02", "Matt Damon", "male", "2008-05-19"];
駄目な例
list tmplist_1 = llListSort(demographics, 1, TRUE); //tmplist_1 == ["2005-11-02", "2007-06-22", "2008-05-19", "John Adams", "Matt Damon", "Shirley Bassey", "female", "male", "male"] //データの集合がばらけて、無意味なソート結果になりました
良い例
データの集合 (いわゆるストライド) は 3 要素単位なので、以下のようにします:
list tmplist_2 = llListSort(demographics,3,TRUE); //templist_2 = ["John Adams", "male", "2007-06-22", "Matt Damon", "male", "2008-05-19", "Shirley Bassey", "female", "2005-11-02"]
飛び石リストをソートする場合、どの要素を基準にソートする事が最も多いだろうかと、一寸立ち止まって考えるのは意義のある事です。各要素グループをソートする際、先頭の要素に関してのみソートが可能だという点に留意してください。例えば (上の例で) 性別によるソートが最も必要そうだという場合は、要素グループの先頭は性別にすべきです。

