2012-10-09 3 views
0

Я искал ответ на этот вопрос в течение нескольких дней, мне удается каким-то образом использовать трюк, чтобы просто опустить эту часть Concatenation и просто использовать несколько отдельных циклов, чтобы повторно вставить разные значения в та же таблица ... но мой вопросОбъединение различных таблиц в Lua

по умолчанию table.sort использует < для сравнения элементов массива, так что он может только сортировать массивы чисел или массивов строк. Напишите сравнение функция, которая позволяет table.sort сортировать массивы смешанных типов. В отсортированном массиве все значения данного типа должны быть сгруппированы вместе. В каждой такой группе номера и строки должны быть отсортированы как обычно, и другие типы должны сортироваться произвольным, но последовательным образом.

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

, как я сказал, я решил это, используя разные для петель, но есть способ, чтобы просто анализировать каждый элемент таблицы затем назначить его в другой таблице ??? Например: «Таблицы, 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

Насколько я понимаю, вы хотите, чтобы отсортировать их сначала по типу, а затем по значению: Вы можете написать свой собственный предикат и передать его для сортировки

-- 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); 
+0

вы можете вскипятить все это, как 4 линии. все, что вам нужно сделать, это проверить, является ли тип (lhs) == «number», и если это так возвращает lhs

+0

Я не понимаю, почему мы должны вводить два значения в функции my_less? - это не просто вход для типа Table в функцию, а затем просто сортировка этой вещи в предопределенной манере ...? –

+0

Это функция сравнения - вы * сравнение *. Сравнение по своей сути включает в себя сравнение по меньшей мере двух объектов. – Puppy

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]

+0

Это не будет сортировать числа в правильном порядке 'A = {1, 2, 21, 12} 'даст это' 1, 12, 2, 21' – tozka

+0

@tozka, обновленный с немного более сложной версией, которая должна это обработать. –

+0

Теперь у вас почти проблема с oposite, а 'A = {2, 12}' будет сортироваться правильно (потому что мы сортируем числа). 'A = {" 2 "," 12 "}' (обратите внимание, что теперь мы сортируем строки, а не цифры) даст '{" 2 "," 12 "}', где правильный порядок сортировки строк равен '{" 12 "," 2 "}' – tozka

Смежные вопросы