Difference between revisions of "LlListSort/ja"

From Second Life Wiki
Jump to navigation Jump to search
(Initial translation)
 
 
(3 intermediate revisions by 3 users not shown)
Line 12: Line 12:
ソートの順番にはデータ型が関係します。<br/>
ソートの順番にはデータ型が関係します。<br/>
それぞれのデータ型で個別にソートが行なわれ、データ型の順番は保持されます。
それぞれのデータ型で個別にソートが行なわれ、データ型の順番は保持されます。
<lsl>llListSort([1, "C", 3, "A", 2, "B"], 1, TRUE) returns [1, "A", 2, "B", 3, "C"]
<source lang="lsl2">
llListSort([1, 3, 2, "C", "A", "B"], 1, TRUE) returns [1, 2, 3, "A", "B", "C"]
llListSort([1, "C", 3, "A", 2, "B"], 1, TRUE);
// returns [1, "A", 2, "B", 3, "C"]


llListSort([1, "C", 3, "A", 2, "B"], 2, TRUE) returns [1, "C", 2, "B", 3, "A"]</lsl>
llListSort([1, 3, 2, "C", "A", "B"], 1, TRUE);
|caveats=*バブル ソートは計算時間が最悪の場合 O(N*N) となるソート アルゴリズムです。リンデン ラボがなぜ{{Wikipedia|1=ヒープソート|lang=ja}}や{{Wikipedia|1=マージソート|lang=ja}}のような O(N*log(N)) になるソート アルゴリズムを採らなかったのか分かりません。この関数の改善に関する議論が [[JIRA]] にありますので、[http://jira.secondlife.com/browse/SVC-2988 ここから投票してください]。
// 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"]</source>
|caveats=*バブル ソートは計算時間が最悪の場合 Big O(N*N) となるソート アルゴリズムです。リンデン ラボがなぜ{{Wikipedia|1=ヒープソート|lang=ja}}や{{Wikipedia|1=マージソート|lang=ja}}のような N*log(N) になるソート アルゴリズムを採らなかったのか分かりません。この関数の改善に関する議論が [[JIRA]] にありますので、[http://jira.secondlife.com/browse/SVC-2988 ここから投票してください]。
* ベクトルはマグニチュードでソートされます。 {{Jira|SVC-5643}}
|constants
|constants
|examples=
|examples=
<lsl>
<source lang="lsl2">
list numbers = [3, "three", 2, "two", 1, "one"];
list numbers = [3, "three", 2, "two", 1, "one"];
default
default
Line 32: Line 41:
     }
     }
}
}
</lsl>
</source>
|helpers
|helpers
|also_functions
|also_functions=
|also_events
{{LSL_DefineRow||[[User:Void_Singer/Functions#List:_Get_Reverse_Order|List: Get Reverse Order]]|入力リストを逆順にしたリストを返します}}
{{LSL_DefineRow||[[LlDialog/ja#サンプル]]|llList は {{LSLG/ja|llDialog}} のボタンを並び替えるのに非常に便利です}}
|also_
|also_tests
|also_tests
|also_articles
|also_articles
Line 43: Line 54:
この関数は実際、同じデータ型の要素についてのみ有効です。複数のデータ型を要素に持つリストにも使用はできます -- 正確に言うと、スクリプトの動作には支障がありません -- が、戻り値は大概無意味なものです。
この関数は実際、同じデータ型の要素についてのみ有効です。複数のデータ型を要素に持つリストにも使用はできます -- 正確に言うと、スクリプトの動作には支障がありません -- が、戻り値は大概無意味なものです。


<lsl>list mylist = ["brown", <0.000000, 0.000000, 0.000000>, "house", 17.005, 100, "cat", <3.000000, 3.000000, 3.000000>, 39];
<source lang="lsl2">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);
list tmplist = llListSort(mylist,1,TRUE);
llSay(0, llList2CSV(tmplist));</lsl>
llSay(0, llList2CSV(tmplist));</source>


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


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


==='''Stride''' パラメタ===
==='''Stride''' パラメタ===
Line 73: Line 84:
===飛び石リストのソート{{Anchor|Sorting Strided Lists}}===
===飛び石リストのソート{{Anchor|Sorting Strided Lists}}===


[[List/ja#Strided_lists|飛び石リスト]]で関連データを一続きのまま保持したい場合、単純にソートするとデータが台無しになってしまいます。
[[List/ja#Strided_lists|飛び石リスト]] があり、そこで関連データを一続きのまま保持している場合、それぞれのリスト要素をそれぞれの基準で並び替えると、データが台無しになってしまいます。


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


====駄目な例{{Anchor|Bad Example}}====
====駄目な例{{Anchor|Bad Example}}====


<lsl>list tmplist_1 = llListSort(demographics, 1, TRUE);
<source lang="lsl2">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"]
//tmplist_1 == ["2005-11-02", "2007-06-22", "2008-05-19", "John Adams", "Matt Damon", "Shirley Bassey", "female", "male", "male"]
//データの集合がばらけて、無意味なソート結果になりました</lsl>
//データの集合がばらけて、無意味なソート結果になりました</source>


====良い例{{Anchor|Good Example}}====
====良い例{{Anchor|Good Example}}====
Line 87: Line 98:
データの集合 (いわゆるストライド) は 3 要素単位なので、以下のようにします:
データの集合 (いわゆるストライド) は 3 要素単位なので、以下のようにします:


<lsl>list tmplist_2 = llListSort(demographics,3,TRUE);
<source lang="lsl2">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"]
//templist_2 = ["John Adams", "male", "2007-06-22", "Matt Damon", "male", "2008-05-19", "Shirley Bassey", "female", "2005-11-02"]
</lsl>
</source>


飛び石リストをソートする場合、どの要素を基準にソートする事が最も多いだろうかと、一寸立ち止まって考えるのは意義のある事です。各要素グループをソートする際、先頭の要素に関してのみソートが可能だという点に留意してください。例えば (上の例で) 性別によるソートが最も必要そうだという場合は、要素グループの先頭は性別にすべきです。
飛び石リストをソートする場合、需要があるとすれば、どのようにソートしたいと真っ先に考えるだろうか、ちょっと寄り道して考えるのはとても意義のあることです。各要素グループをソートする際、先頭の要素に関してのみソートが可能だという点に留意してください。(上のリスト例を使うのに) 性別でソートしたくなるだろうと思った場合、要素グループの先頭は性別にすべきです。
|permission
|permission
|negative_index
|negative_index
Line 99: Line 110:
|cat3
|cat3
|cat4
|cat4
|location=lsa_bubble_sort(): 'linden\indra\lscript\lscript_alloc.h'
|location=lsa_bubble_sort(): {{SourceLink|indra/lscript/lscript_alloc.h|Line=228}}
|issues={{Issue|SVC-2988|Change llListSort to use a faster algorithm|type=fs}}
|issues={{Issue/V1|SVC-2988|llListSort に早いアルゴリズムを採用するように変更|type=fs}}
}}
}}

Latest revision as of 21:17, 25 May 2016

要約

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

サンプル

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