質問

私は使用できません。ソートをソートテーブルと連想指標?

役に立ちましたか?

解決

あなただけの1から始まる連続した整数キー、すなわち、リストとテーブルを並べ替えることができます。あなたは、キーと値のペアの別のテーブルを持っている場合は、ペアのソートそのリストを作ることができます:

function sortpairs(t, lt)
  local u = { }
  for k, v in pairs(t) do table.insert(u, { key = k, value = v }) end
  table.sort(u, lt)
  return u
end
もちろん、この

は、引数のキー/値のペアとして期待するカスタムオーダー(lt)を提供する場合にのみ有効です。

この問題は、仕分けについて関連する質問に、より長で議論されていますLuaのテーブルはを。

他のヒント

一般的に、Luaのテーブルは、純粋な結合配列です。 Luaのコアに使用される特定のハッシュテーブルの実装の副作用として以外の「自然な」順序は存在しません。 (nil以外)Luaのデータ型の値は、キーと値の両方として使用することができるので、これは理にかなっています。しかし、唯一の文字列と数値は賢明な順序付けのいずれかの種類があり、その後、唯一のようなタイプの値の間。

たとえば、このテーブルのソート順がどうあるべきか:

unsortable = {
    answer=42,
    true="Beauty",
    [function() return 17 end] = function() return 42 end,
    [math.pi] = "pi",
    [ {} ] = {},
    12, 11, 10, 9, 8
}

これは、1つの文字列のキー、1つのブールキー、1つのファンクションキー、一つの非整数キー、1つのテーブルのキー、および5つの整数キーを持っています。ソート先の文字列の機能をすべきか?どのように文字列を数値に比較するのですか?どこのテーブルのソートが必要がありますか?そして、何この表に表示されるように発生しませんuserdatathread値についてはどうですか?

慣例により、1から始まる連続的な整数でインデックス付けの値は、一般的にリストとして使用されています。いくつかの機能と共通のイディオムは、この規則に従ってください、とtable.sortは一例です。リスト上で操作する関数は、通常、リストに含まれていないキーに格納されているすべての値を無視します。再び、table.sortは一例であり:それはリストの一部であるキーに格納されている要素のみをソート

別の例は#演算子です。上記の表のために、#unsortable 5 unsortable[5] ~= nilunsortable[6] == nilからです。数値インデックスmath.piに格納された値は、それが整数ではないので、Piは3と4の間であってもカウントされないことに注意してください。さらに、他の非整数キーのどれもいずれかのカウントされません。このループのためのシンプルなリスト全体を反復処理することができることを意味します:

for i in 1,#unsortable do
    print(i,unsortable[i])
end

多くの場合、

のように書かれているが、
for i,v in ipairs(unsortable) do
    print(i,v)
end

要するに、Luaのテーブルは、値の順序付けられていないコレクションは、キーによってインデックス付けはそれぞれ、です。しかし、1から始まる連続的な整数キーのための特別な規則があります。

編集:は、適切な半順序と非整数のキーの特殊なケースでは、回避策別のインデックステーブルを伴うがあります。文字列値をキーテーブルの記述内容は、このトリックに適した例である。

まず、リストの形式で、新しいテーブル内のキーを収集します。すなわち、連続した整数でインデックス付けの表は、値としてソートそのキーで1から始まる作ります。次いで、所望の順序で元のテーブルを反復処理するために、そのインデックスを使用します。

たとえば、ここでそれぞれのキー/値のペアのための関数を呼び出し、テーブルのすべての値を反復処理するためにこの技術を使用しforeachinorder()、順番に比較関数によって決定である。

function foreachinorder(t, f, cmp)
    -- first extract a list of the keys from t
    local keys = {}
    for k,_ in pairs(t) do
        keys[#keys+1] = k
    end
    -- sort the keys according to the function cmp. If cmp
    -- is omitted, table.sort() defaults to the < operator
    table.sort(keys,cmp)
    -- finally, loop over the keys in sorted order, and operate
    -- on elements of t
    for _,k in ipairs(keys) do
        f(k,t[k])
    end
end

これは、インデックスを構築し、 table.sort() 、次いでソートインデックスの各要素をループし、それぞれの関数fを呼び出します。ファンクションfは、キーと値が渡されます。ソート順はtable.sortに渡されるオプションの比較関数によって決定されます。 (この場合、テーブルtのキー)を比較するために、2つの要素と呼ばれ、第二未満である場合trueを返さなければなりません。省略した場合、table.sort内蔵<演算子を使用します。

たとえば、以下の表に与えられた

t1 = {
    a = 1,
    b = 2,
    c = 3,
}

その後、foreachinorder(t1,print)プリントます:

a    1
b    2
c    3

foreachinorder(t1,print,function(a,b) return a>b end)プリントます:

c    3
b    2
a    1

さんが任意の順番で、最初の場所です。このようなものを並べ替えゴミ袋のバナナ.

scroll top