LlListSortStrided/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

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

llListSortStrided は、stride_index パラメータを追加した llListSort であり、どのストライド内のアイテムでもソートできる柔軟性があります。これらのルーチンは同じ基本コードを使用し、計算の複雑さも同じです。
src をすべての stride ごとに stride_index アイテムでソートしたリスト。を list で返します。

• list src ソートするリスト。
• integer stride number of entries per stride, if less than 1 it is assumed to be 1ストライド内の要素数。
• integer stride_index ソートに使用するストライド内のインデックス。stride_index は 0 から始まります。最初の要素は 0、2 番目は 1 などです。インデックス 0 は、llListSort を使用するのと機能的に同じです。
• integer ascending TRUE の場合、ソート順は昇順です。それ以外の場合、降順です。

This function supports Strided Lists.

仕様

ソート順は型に影響を受けます。文字列とキーの場合、大文字小文字を区別し、Unicode 文字コードでソートします。

llListSortStrided(["a", "á", "B", "C", "d", "e"], 1, 0 TRUE) // returns ["B", "C", "a", "d", "e", "á"]

For ascending sort, each type is sorted individually and then feathered to have the same order of types.

llListSortStrided([1, "C", 3, "A", 2, "B"], 1, 0, TRUE) // returns [1, "A", 2, "B", 3, "C"]

llListSortStrided([1, 3, 2, "C", "A", "B"], 1, 0, TRUE) // returns [1, 2, 3, "A", "B", "C"]

llListSortStrided([1, "C", 3, "A", 2, "B"], 2, 0, TRUE) // returns [1, "C", 2, "B", 3, "A"]

llListSortStrided([1, "C", 3, "A", 2, "B"], 2, 1, TRUE) // returns [3, "A", 2, "B", 1, "C"]

警告

  • これは、llListSortと同じ最適化されていない選択ソートアルゴリズムを使用しています。このアルゴリズムのビッグOはN²です。この機能の改善のためにJIRAの問題が存在しています。SVC-2988
  • もともとWikiには、"ascending"パラメーターの非ゼロ値が昇順のソートを生成すると記述されていましたが、これは誤りでした。この機能では、"ascending"パラメーターの値は正確に1(またはTRUE)でなければなりません。
  • ベクトルは大きさでソートされます。SVC-5643
  • ローテーションは意味のある順序でソートされません。ローテーションだけを含むリストが昇順でソートされると、変更されずに返されます。
  • 降順ソートの場合、型が混在している場合、最終的な順序は確定的です(同じ入力は常に同じ出力を生成します)が、完全に役に立たないことがあります。
    llListSortStrided([2, "B", "C", 3, 1, "A"], 1, 0, FALSE) // returns ["A", 3, 1, "C", "B", 2]
    
    ただし、型が混在していない場合、降順ソートは正常に機能します。
  • ストライドが1より大きい場合、リストの長さがストライドの倍数でない場合、リストは変更されずに返されます。
  • 文字列に数字が含まれている場合、数字は他の文字と同様に左から右にソートされます。これは数値の順序と必ずしも一致しないかもしれません。
    llListSortStrided(["127", "3", "25"], 1, 0, TRUE) // returns ["127", "25", "3"] because the 1 in 127 is before the 2 in 25 which is before the 3
    
    これらを数値順にソートするには、文字列内の数字にゼロを詰めることができます。
    llListSortStrided(["127", "003", "025"], 1, 0, TRUE) // returns ["003", "025", "127"]
    
    • この順序は、プリムのインベントリアイテムの順序とは異なります。プリムのインベントリの順序は「自然な順序」です(たとえば、「New Script 2」は「New Script 11」よりも前にソートされます)。
All Issues ~ Search JIRA for related Bugs

サンプル

list score_board = ["Awesome", "Resident", 200, "Star", "Marxman", 999, "Happy2", "Survive", 1];
default
{
    state_entry()
    {
        llOwnerSay("Unsorted: " + llDumpList2String(score_board, ","));
        score_board = llListSortStrided(scoreboard, 3, 0, TRUE);
        llOwnerSay("Sort by first names: " + llDumpList2String(numbers, ","));
        // Object: Sort by first names: Awesome,Resident,200,Happy2,Survive,1,Star,Marxman,999

        score_board = llListSortStrided(scoreboard, 3, 1, TRUE);
        llOwnerSay("Sort by last names: " + llDumpList2String(numbers, ","));
        // Object: Sort by first names: Star,Marxman,999,Awesome,Resident,200,Happy2,Survive,1

        score_board = llListSortStrided(scoreboard, 3, 2, TRUE);
        llOwnerSay("Sort by last names: " + llDumpList2String(numbers, ","));
        // Object: Sort by first names: ,Happy2,Survive,1,Awesome,Resident,200,Star,Marxman,999

    }
}

llListSort と llListSortStrided は実際には同じ型のアイテムに対してのみ機能します。異なるデータ型を保持するリストでも動作しますが、はっきり言って、スクリプトがエラーになることはありませんが、通常、返される結果は意味がありません。

list mylist = ["brown", <0.000000, 0.000000, 0.000000>, "house", 17.005, 100, "cat", <3.000000, 3.000000, 3.000000>, 39];
list tmplist = llListSortStrided(mylist, 1, 0, TRUE);
llSay(0, llList2CSV(tmplist));

This returns in chat:

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

The same ordered in descending order returns even more meaningless results:

list mylist = ["brown", <0.000000, 0.000000, 0.000000>, "house", 17.005, 100, "cat", <3.000000, 3.000000, 3.000000>, 39];
list tmplist = llListSortStrided(mylist, 1, 0, FALSE);
llSay(0, llList2CSV(tmplist));

returns in chat:

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

Utilizing the Results

重要なのは、ソートしているソースリストは変更されないということです。代わりに、新しい、ソートされたリストが生成されます。したがって、これを変数でキャプチャすることが重要です(結果に直接アクションを行っている場合を除く)。

llListSortStrided(myList, 1, 0, TRUE); // You've wasted cpu time; you didn't capture the results

list newlist = llListSortStrided(myList, 1, 0, TRUE);// Okay. You've captured the results.

llSay(0,llList2CSV(llListSortStrided(myList, 1, 0, TRUE))); // No need to capture, using the results right away.

Stride パラメータ

ほとんどの場合、"integer stride" を1に設定するか(0も動作します)、それによってリスト内の各アイテムをその独自の基準でソートするように指示したいでしょう。(ただし、ストライドリストを使用している場合は、ストライドのソートに関する下記の特別なセクションを参照してください。)

ソート順序

パラメータ "integer ascending" をTRUEに設定すると、昇順に並んだソートされたリストが返されます。
例: ["Apples", "Bananas", "Oranges"]

パラメータ "integer ascending" をFALSEに設定すると、降順に並んだソートされたリストが返されます。
例: ["Oranges", "Bananas", "Apples"]

ストライドリストのソート

もしストライドリストを持っていて、関連するデータをチャンクごとにまとめている場合、各リスト要素が独自の基準でソートされると災難です。

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

Bad Example

list tmplist_1 = llListSortStrided(demographics, 1, 0, TRUE);
//tmplist_1 == ["2005-11-02", "2007-06-22", "2008-05-19", "John Adams", "Matt Damon", "Shirley Bassey", "female", "male", "male"]
//ストライドが破壊され、ソートされたデータはもはや有用ではありません。

====Good Example====

Instead, because you have the data grouped (aka "strided") in sets of 3, you need to do this:

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

特記事項

All Issues

~ Search JIRA for related Issues
   Convert llListSort() to use faster sorting methods!
   llSortedListFindList() - improved llListFindList() for known to be sorted lists

Signature

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