2013-09-26 20 views
5

Sorunuma yetecek kadar yakın düşünmüş olduğum başlıkların olduğu gibi, buradaki cevapların çoğunu gözden geçirdim. Kesin bir konuya sahip olan birini görmedim, bu yüzden bir soru soruyorum, umarım basit bir gerçeği görmezden gelmekteyim.Lua Tablo Sıralama 2 karşılaştırması

HP (int) ve mesafeyi (boolean) kaydeden bir tabloyu kodlamaya çalışıyorum ve ardından HP'ye göre yalnızca en üstteki Aralıktakiler ile sıralamaya çalışıyorum.

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 

Bunun çıktısı:

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

ben bundan bekliyordum çıkışı olacaktır:

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

Bu sadece nasıl benim açımdan bir yanlış anlama dua table.sort, bunun gibi çoklu kontrollerle çalışır (bunun gibi bir değişkeni nasıl açıkladığınızı varsaydım).

düzenlemek bilgiye - Ben range=false indeksleri tablosunda neresinde sırasını değiştirirseniz, çıkış değişiklikleri de (hala yanlış). Değerler sıralamadan sonra kendilerini farklı dizinlere ayırır.

cevap

4

Açıklamanıza göre, sipariş fonksiyonunun range ile karşılaştırılması ve ardından hp ile karşılaştırılması gerekmektedir.

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) 

Belki daha kısa bir sürümü var, ama bu emin çalışır ve mantık açıktır.

+0

ty ty! Sanırım yanlış yaptığımı anladım. Geri dönüşün gerçek anlamda olduğunu düşünüyordum. Yani eğer bunu doğru anlayabilseydim, sadece bu hakkı okuduğumdan emin olmak istiyorum. İlk önce her iki aralığın da doğru olduğunu kontrol ettikten sonra HP'ye göre sıralarız. Eğer her iki aralık doğru değilse, o zaman x'in gerçek bir aralığa sahip olup olmadığını göreceğiz, daha sonra doğruya döneceğiz, aksi takdirde y'nin menzile sahip olup olmadığını ve yanlış döndüğünü göreceğiz. Her ikisi de yanlışsa, HP'nin kapsama alanı dışındakileri sıralarız. Testlerimde başarısızlıkla karşılaştığım yerde yanlış bir getiri vardı. Y değerinin düzgün bir şekilde düzeltilmesine yardımcı olmak için bunu yapıyoruz? – Bubba911

+0

@ Bubba911 Bu durumda, 'x.range'' false' iken 'y.range'' true', bu yüzden '' '' '' '' '' '' '' '' ne olursa olsun '' olmalıdır. –

+0

Ty bunu açıklığa kavuşturmak için :) Aklım hala etrafını sarıyordu. Sözlü olarak her şeyi kendime birkaç kez söyledikten sonra, söylediklerim (gönderdikten sonra). Bu yüzden, benim anlayışımın doğru olduğunu duymak harika bir şey! Tekrar teşekkürler, umarım iyi günler dilerim efendim. – Bubba911

0

Bu soruya zaten bir cevabınız var ama bence bu mantığın mantığını nasıl kolaylaştırabileceğinizi kapsayan bir tane daha eklemelisiniz. Burada sunulan fikirler gerçekten agnostiktir.

bir karşılaştırma işlevi sağlama amacı gerçekten bir soruya cevap bulmak: xy önce geleyim mi? Aynı soruyu sormanın bir başka yolu ise, x'un daha yüksek bir önceliğe sahip olmasından sonra y? Çoğunlukla bunu, < operatörüyle aynı sipariş özelliklerini uygularsınız. kesinlikle yönce gelir truesadece x eğer

Yani fonksiyon dönmelidir. Sizin durumunuzda, gerçekten range alanından önce sıralama yapıyorsunuz ve her ikisi de true olarak gerçekleşiyorsa, hp alanını "tie-breaker" olarak kullanın.

Sen aradığınız davranışını verir mantıksal durumunu ifade etmek için en özlü yol bulmak yardımcı olmak için burada bir gerçeği tablo oluşturun:

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

Orijinal durumuna x.hp < y.hp and x.range yakındır ama oldukça tüm olası durumlar için düzeltin.

biz x yanlışsa sonra nihai sonuç ne olursa olsun y ne olduğu da yanlış olduğunu görüyoruz üstünde. Yani y yalnızca x doğru olduğunda dikkate alınır. Son olarak, mantıksal ifadenin sonunda mantıksal ifadenin sonunda olmak için x.hp < y.hp olmasını istiyorum. Bu nedenle, aradığınız mantıksal koşul:

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