LlListSort/ja

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

要約

関数: list llListSort( list src, integer stride, integer ascending );

srcstride の間隔単位でソートしたリストを list で返します。

• list src ソート対象のリスト。
• integer stride 対象とする要素の間隔。1 未満の場合は 1 とみなします。
• integer ascending FALSE の場合は降順、それ以外の場合は昇順にソートします。

この関数は 飛び石リスト (ストライド リスト) を扱えます。

仕様

ソートには遅いバブル ソートが使われています。
ソートの順番にはデータ型が関係します。
それぞれのデータ型で個別にソートが行なわれ、データ型の順番は保持されます。

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"]

llListSort(["2ae", "ah5", "1ag", "aa6", "3ac", "ad7", "ab8", "4af", "ai9"], 1, TRUE);
// returns ["1ag", "2ae" ,"3ac" ,"4af" ,"aa6" ,"ab8" ,"ad7" ,"ah5" ,"ai9"]

警告

  • バブル ソートは計算時間が最悪の場合 Big O(N*N) となるソート アルゴリズムです。リンデン ラボがなぜ"Wikipedia logo"ヒープソート"Wikipedia logo"マージソートのような N*log(N) になるソート アルゴリズムを採らなかったのか分かりません。この関数の改善に関する議論が JIRA にありますので、ここから投票してください
  • ベクトルはマグニチュードでソートされます。 SVC-5643
All Issues ~ Search JIRA for related Bugs

サンプル

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 でも同様) に設定する事になるでしょう。(ただし飛び石リストを扱う場合は、それに関する後述の項を参照してください)

ソート順

引数 ascendingTRUE を設定すると、昇順にソートされたリストが返されます。
昇順の例: ["Apples", "Bananas", "Oranges"]

引数 ascendingFALSE を設定すると、降順にソートされたリストが返されます。
降順の例: ["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"]

飛び石リストをソートする場合、需要があるとすれば、どのようにソートしたいと真っ先に考えるだろうか、ちょっと寄り道して考えるのはとても意義のあることです。各要素グループをソートする際、先頭の要素に関してのみソートが可能だという点に留意してください。(上のリスト例を使うのに) 性別でソートしたくなるだろうと思った場合、要素グループの先頭は性別にすべきです。

関連項目

関数

•  List: Get Reverse Order 入力リストを逆順にしたリストを返します
•  LlDialog/ja#サンプル llList は llDialog のボタンを並び替えるのに非常に便利です

特記事項

All Issues

~ Search JIRA for related Issues
   llListSort に早いアルゴリズムを採用するように変更

ソース

Signature

function list llListSort( list src, integer stride, integer ascending );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。