5

ここで、調査するのに十分なほど問題に近いと思われるタイトルを持つ、見つけられる限り多くの回答を調べました。正確な問題を抱えている人を見たことがないので、単純な事実に無知であることを願って質問しています.

HP (int) と距離 (boolean) を記録するテーブルをコーディングし、HP で並べ替えて、Range のものだけを一番上に表示しようとしています。

local tableTest = {
    {hp = 64, range = true, name="Frank"},
    {hp = 100, range = true, name="Joe"},
    {hp = 2, range = false, name="Jim"},
    {hp = 76, range = true, name="Tim"},
    {hp = 17, range = false, name="Jill"},
    {hp = 16, range = true, name="Phillip"},
}

-- Sort by HP and Range to find lowest Unit in Range.
table.sort(tableTest, function(x,y) return x.hp < y.hp and x.range end)

for i=1, #tableTest do print(tableTest[i].name, tableTest[i].hp) end

この出力は次のとおりです。

Phillip 16
Jim     2
Frank   64
Jill    17
Tim     76
Joe     100

これから期待していた出力は次のようになります。

Phillip 16
Frank   64
Tim     76
Joe     100
Jim     2
Jill    17

table.sort がこのような複数のチェックでどのように機能するかについて、これが単なる誤解であることを祈ります (このような変数を宣言する方法に近いと思いました)。

edit 追加情報 -range=falseテーブル内のインデックスの配置順序を変更すると、出力も変更されます (まだ正しくありません)。値は、並べ替え後に別のインデックスに並べ替えられます。

4

2 に答える 2

4

あなたの説明によると、順序関数はrange最初に比較してから比較する必要がありますhp

table.sort(tableTest, function(x,y) 
                          if x.range and y.range then return x.hp < y.hp 
                          elseif x.range then return true
                          elseif y.range then return false
                          else return x.hp < y.hp end
                      end)

短いバージョンがあるかもしれませんが、これは確かに機能し、ロジックは明確です。

于 2013-09-26T00:57:37.373 に答える
0

この質問に対する回答は既に得られていますが、このロジックについて簡単に推論する方法を説明する別の回答をここに追加する価値があると思います。ここで提示されたアイデアは、実際には言語にとらわれません。

比較関数を提供する目的は、実際には 1 つの質問に答えることです: xはyの前に来るべきですか? 同じ質問をする別の方法は、xはyよりも優先順位が高いですか?ということです。多くの場合、オペレーターと同じ順序付けプロパティでこれを実装します<

したがって、関数はxがyより確実に先行するtrue 場合にのみ返されます。あなたの場合、実際にはrange最初にフィールドで並べ替えており、両方が真の場合は、hpフィールドを「タイブレーカー」として使用します。

ここで真理値表を作成すると、探している動作をもたらす論理条件を表現する最も簡潔な方法を見つけるのに役立ちます。

  x  |  y  |  x before y?
-------------------------
  T  |  T  |  x.hp < y.hp
  T  |  F  |  T
  F  |  T  |  F
  F  |  F  |  F

元の状態x.hp < y.hp and x.rangeは近いですが、考えられるすべてのケースで完全に正しいわけではありません。

上記で、xが false の場合、 yが何であるかに関係なく、最終結果も false であることがわかります。したがって、yはxが true の場合にのみ考慮されます。最後に、lua の論理短絡での誤った条件の警告を回避するためにx.hp < y.hp、論理式の最後に配置する必要があります。したがって、探している論理条件は次のとおりです。

  return x.range and (not y.range or x.hp < y.hp)
于 2013-09-27T00:20:50.580 に答える