在Lua中连接各种表

时间:2012-10-09 13:01:13

标签: sorting loops lua

我一直在寻找这个问题的答案,这几天我设法以某种方式使用一个技巧来省略这个连接部分,只是使用几个单独的循环将不同的值重新插入到同一个表中...... 但我的问题是

  

默认情况下,table.sort使用<比较数组元素,所以它可以   只排序数字数组或字符串数​​组。写一个比较   允许table.sort对混合类型的数组进行排序的函数。在里面   排序数组,给定类型的所有值应该组合在一起。   在每个这样的组中,数字和字符串应该照常排序,   其他类型应以任意但一致的方式排序。

A = { {} , {} , {} , "" , "a", "b" , "c" , 1 , 2 , 3 , -100 , 1.1 , function() end , function() end , false , false , true }

正如我所说,我使用不同的for循环解决了这个问题但有没有办法分析表中的每个元素然后将其分配给不同的表???喜欢:“Tables,Funcs,Nums,Strings,...”然后在分析完成后将它们连接在一起,以便在排序版本中使用相同的表。

我对此的低效答案是:

function Sep(val)
local NewA = {}

   for i in pairs(val) do
      if type(val[i]) == "string" then
     table.insert(NewA,val[i])
      end
   end
for i in pairs(val) do
      if type(val[i]) == "number" then
     table.insert(NewA,val[i])
      end
   end

for i in pairs(val) do
      if type(val[i]) == "function" then
     table.insert(NewA,tostring(val[i]))
      end
   end

for i in pairs(val) do
      if type(val[i]) == "table" then
     table.insert(NewA,tostring(val[i]))
      end
   end

for i in pairs(val) do
      if type(val[i]) == "boolean" then
     table.insert(NewA,tostring(val[i]))
      end
   end

for i in pairs(NewA) do
   print(NewA[i])
end
end

2 个答案:

答案 0 :(得分:2)

据我了解,您希望先按类型排序,然后按值排序: 您可以编写自己的自定义谓词并将其传递给排序

-- there would be need of custom < function since tables cannot be compared
-- you can overload operator < as well I suppose.
 function my_less (lhs, rhs)
    if (type (lhs) ~= "number" or type (lhs) ~= "string") then
        return tostring (lhs) < tostring (rhs) 
    else
        return lhs < rhs;
    end;
 end;

 -- the custom predicate I mentioned
 function sort_predicate (a,b)
    -- if the same type - compare variable, else compare types
    return (type (a) == type (b) and my_less (a, b)) or type (a) < type (b);
 end

 table.sort (A, sort_predicate);

答案 1 :(得分:0)

A = { {}, {}, {}, "", "a", "b", "c", "2", "12", 1, 2, 3, -100, 1.1, 12, 11,
  function() end, function() end, false, false, true }

table.sort(A, function(a,b)
  if type(a) == type(b) and type(a) == 'number' then return a < b end
  return type(a)..tostring(a) < type(b)..tostring(b) end)

会给你这个:

{false, false, true, function() end, function() end,
 -100, 1, 1.1, 2, 3, 11, 12, "", "12", "2", "a", "b", "c", {}, {}, {}}

[根据@ tozka的评论更新]