Сортировка массива по булеву и алфавиту

Leatington

Фанат Рейзора
Автор темы
264
75
Версия MoonLoader
.027.0-preview
Доброй ночи. У меня одномерный массив, нужно отсортировать его сначала по первому параметру (bool), а затем по второму (string, по алфавиту).
1610918466328.png

Этот способ работает, но только если буква одна...​
 
Решение
Lua:
local vals = {
        { false, 'a' },
        { true,  'a' },
        { true,  'b' },
        { false, 'c' },
        { true,  'd' }
}

local function func_sort(lvalue, rvalue)
        if lvalue[1] and not rvalue[1] then return true
        elseif not lvalue[1] and rvalue[1] then return false end

        return lvalue[2] < rvalue[2]
end

table.sort(vals, func_sort)

for i = 1, #vals do
        local k = vals[i]
        print(k[1], k[2])
end
Screenshot_2021-01-18-00-00-05-71_84d3000e3f4017145260f7618db1d683.jpg

Screenshot_2021-01-18-00-03-19-43_84d3000e3f4017145260f7618db1d683.jpg

CaJlaT

07.11.2024 14:55
Модератор
2,848
2,692
Ты так не отсортируешь никогда, попробуй даже в своём варианте поменять буквы, он расставит булевые значения в разнобой...
1610919902182.png

P.s: Спасибо, что дал код в текстовом формате и мне не пришлось его переписывать с картинки (НЕТ)

Lua:
local mytable = {
    {true, 'adf'},
    {false, 'abd'},
    {false, 'cbd'},
    {true, 'bda'},
    {false, '1da'},
    {true, '6df'},
    {true, 'd3s'},
    {true, 'a01'},
    {false, 'maf'},
    {false, 'kde'}
}
table.sort(mytable, function(a, b)
    local a = (a[1] == true and 1 or 0)
    local b = (b[1] == true and 1 or 0)
    return a > b
end)
print('Bool sort:')
for k, v in pairs(mytable) do print(v[2], v[1]) end
table.sort(mytable, function(a, b)
    return a[2] < b[2]
end)
print()
print('Alphabet sort:')
for k, v in pairs(mytable) do print(v[2], v[1]) end
 

imring

Ride the Lightning
Всефорумный модератор
2,366
2,556
Lua:
local vals = {
        { false, 'a' },
        { true,  'a' },
        { true,  'b' },
        { false, 'c' },
        { true,  'd' }
}

local function func_sort(lvalue, rvalue)
        if lvalue[1] and not rvalue[1] then return true
        elseif not lvalue[1] and rvalue[1] then return false end

        return lvalue[2] < rvalue[2]
end

table.sort(vals, func_sort)

for i = 1, #vals do
        local k = vals[i]
        print(k[1], k[2])
end
Screenshot_2021-01-18-00-00-05-71_84d3000e3f4017145260f7618db1d683.jpg

Screenshot_2021-01-18-00-03-19-43_84d3000e3f4017145260f7618db1d683.jpg