24

Luaでソートしたいキー=>値テーブルがあります。キーはすべて整数ですが、連続していません (意味があります)。Lua の唯一のソート関数はtable.sort、テーブルを単純な配列として扱い、元のキーと特定の項目との関連付けを破棄する のようです。代わりに、基本的にはPHP のasort()関数を使用できるようにしたいと考えています。

私が持っているもの:

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

並べ替え操作の後に欲しいもの:

items = {
    [1234] = "bar",
    [3188] = "baz",
    [1004] = "foo",
    [7007] = "quux",
}

何か案は?

編集:回答に基づいて、私が使用している特定の埋め込みLuaインタープリターの単なる奇妙な癖であると想定しますが、すべてのテストで、pairs()常に追加された順序でテーブル項目を返しますテーブル。(つまり、上記の 2 つの宣言は異なる方法で繰り返されます)。

残念ながら、これは通常の動作ではないため、必要なものを取得できないようです。Lua には (もちろん) 必要なツールが組み込まれておらず、組み込み環境は私が回避するにはあまりにも制限されています。

それでも、皆さん、助けてくれてありがとう!

4

6 に答える 6

40

あなたは何かを誤解しているようです。ここにあるのは連想配列です。連想配列には明示的な順序はありません。たとえば、それらを順序付けるのは内部表現 (通常はソートされます) のみです。

つまり、Lua では、投稿した配列はどちらも同じです。

代わりに、次のような表現が必要です。

items = {
    {1004, "foo"},
    {1234, "bar"},
    {3188, "baz"},
    {7007, "quux"},
}

現在、インデックスでそれらを取得することはできませんが (インデックスは 1、2、3、4 ですが、別のインデックス配列を作成できtable.sortます)、 を使用して並べ替えることができます。

ソート関数は次のようになります。

function compare(a,b)
  return a[1] < b[1]
end

table.sort(items, compare)
于 2010-01-10T20:17:59.427 に答える
12

Komel が言ったように、順序が保証されていない連想配列を扱っています。

連想配列の機能を維持しながら、関連付けられた値に基づいてキーの順序付けを行う場合は、次のようにします。

function getKeysSortedByValue(tbl, sortFunction)
  local keys = {}
  for key in pairs(tbl) do
    table.insert(keys, key)
  end

  table.sort(keys, function(a, b)
    return sortFunction(tbl[a], tbl[b])
  end)

  return keys
end

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

local sortedKeys = getKeysSortedByValue(items, function(a, b) return a < b end)

sortedKeys は {1234,3188,1004,7007} であり、次のようにデータにアクセスできます。

for _, key in ipairs(sortedKeys) do
  print(key, items[key])
end

結果:

1234     bar     
3188     baz     
1004     foo     
7007     quux    
于 2014-07-04T02:16:44.827 に答える
6

うーん、繰り返しを制御できないという部分を見逃しました。そこの

しかし、lua では通常、常に方法があります。

http://lua-users.org/wiki/OrderedAssociativeTable

それが始まりです。ここで、ライブラリが使用するpairs()を置き換える必要があります。それはpairs=my_pairsのような単純なものかもしれません。その後、上記のリンクのソリューションを使用できます

于 2010-01-10T20:57:32.940 に答える
3

PHP 配列は Lua テーブルとは異なります。

  • PHP 配列には、キーと値のペアの順序付きリストが含まれる場合があります。

  • Lua テーブルには、キーと値のペアの順序付けられていないセットが常に含まれています。

プログラマーが整数 1、2、3、... をキーとして使用することを選択した場合、Lua テーブルは配列として機能します。のような言語構文と標準ライブラリ関数は、table.sort連続する整数キーを持つテーブルを特別にサポートしています。

したがって、PHP 配列をエミュレートしたい場合は、キーと値のペアのリストを使用してそれを表す必要があります。これは実際にはテーブルのテーブルですが、キーと値のペアのリストと考える方が便利です。 . カスタムの "less-than" 関数を に渡すtable.sortと、準備は完了です。

注: Lua を使用すると、連続する整数キーを同じテーブル内の他の種類のキーと混在させることができ、その表現は効率的です。私はこの機能を時々使用しますが、通常はいくつかのメタデータで配列にタグを付けます。

于 2010-01-11T03:46:21.663 に答える
3

数か月後、同じクエリでこれに到達します。推奨される回答は、必要なものとこれが LUA でどのように見えるかの間のギャップを正確に示しているように見えましたが、正確に求めていたものは得られませんでした:-これはキーでソートされたハッシュでした。

ただし、このページの最初の 3 つの関数は DID です: http://lua-users.org/wiki/SortedIteration

于 2011-05-12T12:15:17.450 に答える
1

数年前に少しだけ Lua コーディングをしましたが、もはや流暢ではありません。

同様の問題に直面したとき、キーと値を逆にして配列を別の配列にコピーsortし、新しい配列で使用しました。

Kornel Kisielewicz が推奨する方法を使用して配列をソートする可能性を知りませんでした。

于 2010-01-10T20:48:41.297 に答える