Сртировка

Страницы: 1
RSS
Сртировка
 
Приветствую!

Есть массив:
BigTab[12,2] = {s = 11,f =22}
BigTab[11,1] = {s = 11,f =22}
BigTab[14,1] = {s = 11,f =22}
BigTab[3,32] = {s = 11,f =22}

нужно отсортировать от большего (14,1) к меньшему (3,32).

Этот вариант не подходит:

function compare(a,b)
return a > b
end

table.sort(BigTab,compare)

Как правильно сделать сортировку?

Заранее благодарен за ответ!
 
Цитата
Роман написал:
Есть массив:
BigTab[12,2] = {s = 11,f =22}
BigTab[11,1] = {s = 11,f =22}
BigTab[14,1] = {s = 11,f =22}
BigTab[3,32] = {s = 11,f =22}
Это на каком языке написано?
 
На lua, ну это пример, инициализация конечно сначало BigTab = {}
 
Цитата
Роман написал:
На lua
Вы бы хотя бы для начала откомпилировать попробовали то, что написали...
 
А ну да, в US формате:

BigTab = {}

BigTab[12.2] = {s = 11,f =22}
BigTab[11.1] = {s = 11,f =22}
BigTab[14.1] = {s = 11,f =22}
BigTab[3.32] = {s = 11,f =22}
 
Цитата
Роман написал:
А ну да, в US формате:
Я вот вначале вообще подумал, что вы так адресацию двухмерного массива делаете, а потом его индекс пытаетесь отсортировать... даже «Альфу» вспомнил, где такой синтаксис применялся, ну да ладно...

Решение вашей задачи есть в книжке по Lua, код оттуда: 19.3 – Sort
Код
BigTab = {}
BigTab[12.2] = {s = 11, f =22}
BigTab[11.1] = {s = 11, f =22}
BigTab[14.1] = {s = 11, f =22}
BigTab[3.32] = {s = 11, f =22}

for k, v in pairs(BigTab) do
    print(tostring(k).." = "..tostring(v))
end
print()

function pairsByKeys(t, f)
    local a = {}
    for n in pairs(t) do table.insert(a, n) end
    table.sort(a, f)
    local i = 0      -- iterator variable
    local iter = function ()   -- iterator function
        i = i + 1
        if a[i] == nil then return nil
        else return a[i], t[a[i]]
        end
    end
    return iter
end

for k, v in pairsByKeys(BigTab) do
    print(tostring(k).." = "..tostring(v))
end
Вывод:
Код
11.1 = table: 005099A8
3.32 = table: 00509890
12.2 = table: 00509A98
14.1 = table: 00509868

3.32 = table: 00509890
11.1 = table: 005099A8
12.2 = table: 00509A98
14.1 = table: 00509868
 
Suntor, а если наоборот?  от большего (14,1) к меньшему (3,32)
 
Цитата
Роман написал:
Suntor , а если наоборот?  от большего (14,1) к меньшему (3,32)
Добавить свою ф-цию сравнения при вызове pairsByKeys:
Код
for k, v in pairsByKeys(t, function (a, b) return a > b end) do
    ...
end
 
Благодарю вас, Suntor!  Попробую ваш вариант!

И если уж дело идёт, снежный вопрос, на который не могу найти решение, если у нас индекс массива с плавающей точкой, какую функцию использовать, что бы получить первое и/или последнее значение индекса, существует ли простой вариант без использования циклов?

Заранее благодарен за ваш ответ!
 
Цитата
Роман написал:
если у нас индекс массива с плавающей точкой, какую функцию использовать, что бы получить первое и/или последнее значение индекса, существует ли простой вариант без использования циклов?
Думаю что нет. Без явной сортировки не получится. По аналогии с ф-цией pairsByKeys, можно сделать такую же ф-цию возвращающую первый и последний элементы таблицы с сортировкой по вещественному индексу:
Код
local t = {}
t[15.5] = "aaa"
t[3.1] = "bbb"
t[7.8] = "ccc"
t[115.5] = "aaa"
t[23.1] = "bbb"
t[557.8] = "ccc"
t[14.5] = "aaa"
t[43.1] = "bbb"
t[87.8] = "ccc"

function getFirstAndLastByKeys(t, f)
    local a = {}
    for n in pairs(t) do table.insert(a, n) end
    table.sort(a, f)
    return a[1], t[a[1]], a[#a], t[a[#a]]
end

local first_k, first_v, last_k, last_v = getFirstAndLastByKeys(t)
print(first_k.." = "..first_v)
print(last_k.." = "..last_v)
Вывод:
Код
3.1 = bbb
557.8 = ccc
 
Спасибо вам Suntor!
 
Цитата
Роман написал:
Спасибо вам  Suntor !
Да не за что... )))
Страницы: 1
Читают тему
Наверх