2013-09-26 14 views
5

私は、私が調べるべき問題の近くにあると思ったタイトルを持っていることがわかったので、ここで多くの答えを出しました。私は私の正確な問題を抱えている人は見ていないので、私は単純な事実に無知であることを願っています。ルアテーブルソート2比較

私は、HP(int)と距離(ブール値)を記録し、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は、このような複数のチェックで動作します(私はあなたがこのような変数を宣言する方法に近いと仮定しました)。

編集 追加情報 - 私はrange=falseインデックスは、テーブルに置かれている場所の順序を変更する場合は、出力が変化だけでなく(まだ正しくありません)。これらの値は、ソート後に異なるインデックスにソートされます。

答えて

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) 

おそらくもっと短いバージョンがありますが、これは確実に機能し、ロジックは明確です。

+0

ty ty!私は私が間違っていたことをちょっと理解していると思う。私は真実を返すという点で考えていました。だから私がこれを正しく理解するならば、私はこの権利を読んでいることを確認したいだけです。 まず、両方の範囲が真であることを確認した後、HPで並べ替えます。両方の範囲が真でない場合は、xが真の範囲を持っているかどうかを確認し、trueを返します。そうでなければ、yに範囲があり、falseを返します。両方が偽の場合、HPは範囲外のものをHPでソートします。 テストで失敗した場所は、elseif y.rangeがfalseを返すことでした。私たちは、yの値を正しく並べ替えるのを助けるためにこれを行いますか? – Bubba911

+0

@ Bubba911その場合、 'x.range'は' false'ですが、 'y.range'は' true'なので 'x'は' hp'の値にかかわらず 'y'の後になければなりません。 –

+0

それを明らかにするためのタイ:)私の心はまだそれの周りを包んでいた。あなたが言ったことは、私が口頭で(投稿後に)思いついたことです。それは私の理解が正しいことを聞いて大変です!もう一度ありがとう、素晴らしい日を過ごすことを願っています。 – Bubba911

0

あなたは既にこの質問に対する回答を得ていますが、この論理についてもっと簡単な理由を説明できる別の記事を追加する価値があると思います。ここに提示されたアイデアは、実際には言語にとらわれないものです。

比較機能を提供する目的は、一つの質問に答えることは本当にあります。xYの前に来るべきですか?同じ質問をするもう1つの方法は、xの優先順位がyと高いですか?多くの場合、<オペレータと同じオーダープロパティを使用して実装します。

だからあなたの関数は、xは間違いYに先行している場合にのみtrueを返す必要があります。あなたのケースでは、最初にrangeフィールドでソートしていて、両方がtrueの場合はとなり、その後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が偽であるならば、最終的な結果にかかわらず、Yが何であるかのも虚偽であることがわかります。したがってyは、xがtrueの場合にのみ考慮されます。最後に、luaの論理短絡における偽の状態の警告を避けるために、x.hp < y.hpが論理式の最後になるようにします。したがって、あなたが探している論理条件は次のとおりです。

return x.range and (not y.range or x.hp < y.hp)