LlListSort/ja

From Second Life Wiki

メインページ > LlListSort > LlListSort/ja
Jump to: navigation, search

関数: 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"]

警告

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

飛び石リストをソートする場合、どの要素を基準にソートする事が最も多いだろうかと、一寸立ち止まって考えるのは意義のある事です。各要素グループをソートする際、先頭の要素に関してのみソートが可能だという点に留意してください。例えば (上の例で) 性別によるソートが最も必要そうだという場合は、要素グループの先頭は性別にすべきです。

ディープノート

要因

New Feature - A new feature of the product, which has yet to be developed. Open - The issue is open and ready for the assignee to start work on it.    Change llListSort to use a faster algorithm

情報源

lsa_bubble_sort(): 'linden\indra\lscript\lscript_alloc.h'

この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。
Personal tools
In other languages