Возврат индекса отсортированного списка в Lua

Я получаю доступ к свойствам объекта с порядковым номером

object = {}
object.y = {60,20,40}
object.g = {box1,box2,box3} -- graphic
object.c = {false,false,false} -- collision
-- object.y[2] is 20 and its graphic is box2
-- sorted by y location, index should be, object.sort = {2,3,1}

Я знаю, что table.sort сортирует список, но как я могу отсортировать список y, который возвращает индекс, чтобы отрисовывать каждый объект впереди в зависимости от местоположения y.

Может функцию быстрой сортировки можно отредактировать, я в этом не разбираюсь. http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Lua

https://github.com/mirven/lua_snippets/blob/master/lua/quicksort.lua

Это возможно?


person John Moore    schedule 10.02.2016    source источник


Ответы (3)


Это должно работать:

local temp = {}
local values = object.y
-- filling temp with all indexes
for i=1,#values do
    temp[i] = i
end
-- sorting the indexes, using object.y as comparison
table.sort(temp,function(a,b)
    return values[a] < values[b]
end)
-- sorting is done here, have fun with it
object.sort = temp

temp будет {2,3,1} при использовании этого кода в сочетании с вашим.

person EinsteinK    schedule 10.02.2016
comment
Отлично. Используя этот метод, я могу идентифицировать объект по его статическому индексу вместо того, чтобы искать его идентификатор после сортировки. Огромное спасибо - person John Moore; 11.02.2016

Не храните данные так, как вы это делаете сейчас. Используйте что-то вроде:

object = {
  {
    y = 60,
    g = box1,
    c = false,
  },
  {
    y = 20,
    g = box2,
    c = false,
  },
  {
    y = 40,
    g = box3,
    c = false,
  },
}

а затем используйте следующую функцию обратного вызова в table.sort:

function CustomSort(L, R)
  return L.y > R.y
end

как показано ниже:

table.sort(object, CustomSort)
person hjpotter92    schedule 10.02.2016
comment
Большое спасибо. Супер прост в использовании. - person John Moore; 10.02.2016
comment
Круто - искал что-то подобное. - person John Wakefield; 10.02.2016

@EinsteinK @hjpotter92 : Спасибо

РЕЗУЛЬТАТ: Это окончательный вариант ответов, которые я получил. Мой вопрос решен.

Используйте sortIndex(object), чтобы получить отсортированный список в object.sort. Обновление сортировки после перемещения объектов.

box1 = love.graphics.newImage("tile1.png")
box2 = love.graphics.newImage("tile2.png")
box3 = love.graphics.newImage("tile3.png")
hero = love.graphics.newImage("hero.png")
object = {
    {   x = 200,    y =  50,    g = box1 },
    {   x =  50,    y = 100,    g = box2 },
    {   x = 150,    y = 200,    g = box3 },
    {   x =   0,    y =   0,    g = hero }
}
function sortIndex(item)
--  Sort id, using item values
    local function sortY(a,b)
        return item[a].y < item[b].y
    end
    --------------------------------
    local i
    local id = {}       -- id list
    for i = 1, #item do -- Fill id list
        id[i] = i
    end
--  print( unpack(id) ) -- Check before
    table.sort(id,sortY)-- Sort list
--  print( unpack(id) ) -- Check after
    item.sort = id      -- List added to object.sort
end

sortIndex(object) -- print( unpack(object.sort) ) -- Check sorted id's

function drawObject()
    local i,v, g,x,y
    for i = 1, #object do
        v = object.sort[i] -- Draw in order
        x = object[v].x
        y = object[v].y
        g = object[v].g
        love.graphics.draw(g,x,y)
    end
end
person John Moore    schedule 11.02.2016