LlListSort/ja

From Second Life Wiki
< LlListSort
Revision as of 06:28, 18 May 2009 by MasterOf Perl (talk | contribs) (Initial translation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

要約

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

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

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

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

仕様

ソートには遅いバブル ソートが使われています。
ソートの順番にはデータ型が関係します。
それぞれのデータ型で個別にソートが行なわれ、データ型の順番は保持されます。 <lsl>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"]</lsl>

警告

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

サンプル

<lsl> 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
   }

}

</lsl>

注意点

データ型

この関数は実際、同じデータ型の要素についてのみ有効です。複数のデータ型を要素に持つリストにも使用はできます -- 正確に言うと、スクリプトの動作には支障がありません -- が、戻り値は大概無意味なものです。

<lsl>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));</lsl>

これは以下のようにチャットで返します:

brown, <0.000000, 0.000000, 0.000000>, cat, 17.004999, 39, house, <3.000000, 3.000000, 3.000000>, 100

戻り値の利用

ソート対象となった元のリストは変更されない事に注意してください。ソート結果は新しい別の配列として返されます。従って (戻り値を直接処理するのでないならば) 戻り値を変数に収めることが重要です。

<lsl>llListSort(myList,1,TRUE); // 無駄な事をしましたね。戻り値を保存しなくては。
list newlist = llListSort(myList,1,TRUE);//そう、戻り値を保存しました。
llSay(0,llList2CSV(llSortList(myList,1,TRUE))); //戻り値を直接扱うので、保存は不要です。</lsl>

Stride パラメタ

殆どの場合、リストの各要素を単純にソートするため "飛び石間隔" を 1 (あるいは 0 でも同様) に設定する事になるでしょう。(ただし飛び石リストを扱う場合は、それに関する後述の項を参照してください)

ソート順

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

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

飛び石リストのソート

飛び石リストで関連データを一続きのまま保持したい場合、単純にソートするとデータが台無しになってしまいます。

<lsl>list demographics = ["John Adams", "male", "2007-06-22", "Shirley Bassey", "female", "2005-11-02", "Matt Damon", "male", "2008-05-19"];</lsl>

駄目な例

<lsl>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"] //データの集合がばらけて、無意味なソート結果になりました</lsl>

良い例

データの集合 (いわゆるストライド) は 3 要素単位なので、以下のようにします:

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

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

特記事項

All Issues

~ Search JIRA for related Issues
   Change llListSort to use a faster algorithm

ソース

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

Signature

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