なのにソートテーブルを連想指数
-
21-09-2019 - |
質問
私は使用できません。ソートをソートテーブルと連想指標?
解決
あなただけの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つの整数キーを持っています。ソート先の文字列の機能をすべきか?どのように文字列を数値に比較するのですか?どこのテーブルのソートが必要がありますか?そして、何この表に表示されるように発生しませんuserdata
とthread
値についてはどうですか?
慣例により、1から始まる連続的な整数でインデックス付けの値は、一般的にリストとして使用されています。いくつかの機能と共通のイディオムは、この規則に従ってください、とtable.sort
は一例です。リスト上で操作する関数は、通常、リストに含まれていないキーに格納されているすべての値を無視します。再び、table.sort
は一例であり:それはリストの一部であるキーに格納されている要素のみをソート
別の例は#
演算子です。上記の表のために、#unsortable
5 unsortable[5] ~= nil
とunsortable[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
たとえば、以下の表に与えられた
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
さんが任意の順番で、最初の場所です。このようなものを並べ替えゴミ袋のバナナ.