Sorting Lua表排序2

Sorting Lua表排序2,sorting,lua,return,lua-table,Sorting,Lua,Return,Lua Table,在这里,我已经尽可能多地阅读了我能找到的答案,这些答案中的标题与我的问题非常接近。我没有看到任何人有我的确切问题,所以我问了一个问题,我希望只是我对一个简单的事实一无所知 我试图编写一个记录HP(int)和距离(boolean)的表,然后按HP排序,只将范围内的值放在顶部附近 local tableTest = { {hp = 64, range = true, name="Frank"}, {hp = 100, range = true, name="Joe"}, {h

在这里,我已经尽可能多地阅读了我能找到的答案,这些答案中的标题与我的问题非常接近。我没有看到任何人有我的确切问题,所以我问了一个问题,我希望只是我对一个简单的事实一无所知

我试图编写一个记录HP(int)和距离(boolean)的表,然后按HP排序,只将范围内的值放在顶部附近

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
Frank   64
Tim     76
Joe     100
Jim     2
Jill    17
我祈祷这只是我对table.sort如何与这样的多个检查一起工作的误解(我假设它更接近于您如何声明这样的变量)

编辑
附加信息-如果我更改
range=false
索引在表中的位置顺序,则输出也会更改(仍然不正确)。排序后,这些值只是将自己排序到不同的索引中。

根据您的描述,您的订单函数需要先比较
范围
,然后比较
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)
table.sort(tableTest,function(x,y)
如果是x.range和y.range,则返回x.hp

也许有一些较短的版本,但这个版本确实有效,逻辑也很清楚。

你已经得到了这个问题的答案,但我认为值得在这里添加另一个版本,介绍如何更容易地推理这个逻辑。这里提出的观点实际上与语言无关


提供比较函数的目的实际上是为了回答一个问题:x应该在y之前吗?问同样问题的另一种方式是,x的优先级是否高于y?通常,您使用与
ty!我想我有点明白我做错了什么。我只是在考虑回归真的。所以,如果我想正确理解这一点,我只想确保我读的是正确的。首先,我们检查这两个范围是否为真,然后按HP排序。如果两个范围都不是真的,那么我们将查看x是否有真的范围,然后返回真,否则我们将查看y是否有范围并返回假。如果两者都为假,则我们将按HP对超出范围的进行排序。我在测试中失败的地方是elseif y.range返回false。我们这样做是为了帮助y值正确排序?@Bubba911在这种情况下,
x.range
false
,而
y.range
true
,因此
x
应该在
y
之后,无论
hp
.Ty的值是什么,我的思想仍然围绕着它。在对自己大声说了几次之后,你所说的就是我(发帖后)想到的。听到我的理解是正确的,真是太好了!再次感谢你,希望你有一个伟大的一天你很好,先生。
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)
  x  |  y  |  x before y?
-------------------------
  T  |  T  |  x.hp < y.hp
  T  |  F  |  T
  F  |  T  |  F
  F  |  F  |  F
  return x.range and (not y.range or x.hp < y.hp)