Lua表排序声明无效的排序功能

时间:2016-05-07 18:56:24

标签: sorting lua

我目前在LuaTeX中有一个更大的程序(这是一个带有内置lua解释器的TeX引擎),并且在程序的一部分中对表进行了排序。表元素本身就是具有特定结构的表,排序函数如下所示:

function sort_list_function (a,b)

  if a.totalfilll < b.totalfilll then
    return true
  elseif a.totalfill < b.totalfill then
    return true
  elseif a.totalfil < b.totalfil then
    return true
  elseif a.totalvalue + a.height + a.totalplus <
         b.totalvalue + b.height + b.totalplus
  then   
    return true
  else
    return false
  end       
end

所有元素值都是数字,所以根据我的理解,比较函数的要求得到满足,但也许我的想法不在这里(这基本上是问题,即,为什么或在什么情况下上面会导致无效订单功能错误)。

遗憾的是,错误只是非常难以隔离,只发生在一次的情况下,然后只有在代码成功完成了很多种情况之后,所以作为第一步,我想确保我不会完全失踪像上面这样的函数显然有问题。

2 个答案:

答案 0 :(得分:4)

好的,感谢来自@ColonelThirtyTwo的提示,答案是比较函数确实是错误的,我也必须明确处理>个案并立即返回false(在我的例子中是不同的测试)意味着具有不同的重要性顺序),例如,

  if a.totalfilll < b.totalfilll then
    return true
  elseif a.totalfilll > b.totalfilll then
    return false
  elseif a.totalfill < b.totalfill then
    return true
  elseif a.totalfill > b.totalfill then
    return false
  elseif a.totalfil < b.totalfil then
    return true
  elseif a.totalfil > b.totalfil then
    return false
  else
    return ( a.totalvalue + a.height + a.totalplus <
             b.totalvalue + b.height + b.totalplus    )
  end   

答案 1 :(得分:0)

另一种比较容易理解的方法。

function sort_list_function (a,b)
  if a.totalfilll ~= b.totalfilll then
    return a.totalfilll < b.totalfilll
  elseif a.totalfill ~= b.totalfill then
    return a.totalfill < b.totalfill
  elseif a.totalfil ~= b.totalfil then
    return a.totalfil < b.totalfil
  else
    return ( a.totalvalue + a.height + a.totalplus <
             b.totalvalue + b.height + b.totalplus )
  end
end