LlListSort/ja

From Second Life Wiki
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"]

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

警告

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

サンプル

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

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

関連項目

関数

•  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の関連した項目が参考になるかもしれません。