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 如何与这样的多个检查一起工作的误解(我认为它更接近于你如何声明这样的变量)。

编辑 附加信息 - 如果我更改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

您已经得到了这个问题的答案,但我认为值得在这里添加另一个答案,涵盖如何更轻松地推理此逻辑。这里提出的想法实际上与语言无关。

提供比较函数的目的实际上是为了回答一个问题:x应该在y之前吗?问同样问题的另一种方法是,x的优先级是否高于y?通常,您使用与运算符相同的排序属性来实现它<

true 因此,只有当x绝对在y之前,您的函数才应该返回。在您的情况下,您实际上是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为假,那么无论y是什么,最终结果也是假的。因此,仅当x为真时才考虑y 。最后,为了避免在 lua 中的逻辑短路中出现错误条件的警告,我们希望位于逻辑表达式的末尾。因此,您正在寻找的逻辑条件是:x.hp < y.hp

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