2013-09-26 4 views
5

Я перешел на многие ответы здесь, поскольку я мог найти, что у меня были названия, которые я считал достаточно близко к моей проблеме, чтобы заглянуть. Я не видел, чтобы кто-то имел мою точную проблему, поэтому я задаю вопрос, я надеюсь, что я просто незнаю с простым фактом.Lua Table Sorting 2 сравнивает

Я пытаюсь закодировать таблицу, в которой записываются 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 работает с несколькими проверками, подобными этому (я предположил, что он ближе к тому, как вы объявляете такую ​​переменную).

редактировать Дополнительной информации - Если изменить порядок, где 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. Где я потерпел неудачу в своих тестах, было elseif y.range return false. Мы делаем это, чтобы помочь корректно сортировать значение y правильно? – Bubba911

+0

@ Bubba911 В этом случае 'x.range' является' false', тогда как 'y.range' является' true', поэтому 'x' должно быть после' y', независимо от значения 'hp'. –

+0

Ty для пояснения: :) Мой разум все еще обертывался вокруг него. После словесного произнесения всего вслух себе пару раз, вы сказали, что я придумал (после публикации). Так здорово слышать, что я понимаю это правильно! Еще раз спасибо, надеюсь, у вас отличный день, сэр. – Bubba911

0

У вас уже есть ответ на этот вопрос, но я думаю, что стоит добавить еще один здесь, который объясняет, как вы можете рассуждать об этой логике легче. Представленные здесь идеи действительно языковые агностики.

Цель обеспечения функции сравнения действительно ответить на один вопрос: Если х прийти до у? Другой способ задать тот же вопрос: 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 близко, но не совсем правильно для всех возможных случаев.

Выше мы видим, что если х ложно, то конечный результат также ложно, независимо от того, что у есть. So y Учитывается, когда x имеет значение. Наконец, чтобы избежать оговорки о ложном состоянии в логическом коротком замыкании в lua, мы хотим, чтобы x.hp < y.hp находился в конце логического выражения. Таким образом, логическое условие, которое вы ищете, это:

return x.range and (not y.range or x.hp < y.hp) 
Смежные вопросы