Search code examples
sortinglua

Sort table in lua as multible groups


I need to sort a list _rolls to have both the users rolls and ranks taken into considerations.

_rolls = {
    {Username="User1", Roll=50, RankPrio=1},
    {Username="User2", Roll=2, RankPrio=3},
    {Username="User4", Roll=10, RankPrio=2},
    {Username="User5", Roll=9, RankPrio=2},
    {Username="User3", Roll=32, RankPrio=2}
}

I want the list to be sorted like

_rolls = {
    {Username="User2", Roll=2, RankPrio=3},
    {Username="User3", Roll=32, RankPrio=2},
    {Username="User4", Roll=10, RankPrio=2},
    {Username="User5", Roll=9, RankPrio=2},
    {Username="User1", Roll=50, RankPrio=1}
}

i know i can use this to sort by Rolls but i cant see a way to do both.

table.sort(_rolls, function(a,b) return a.Roll < b.Roll end)

Solution

  • You just need to write the comparison function so that it compares the Roll fields when the RankPrio fields compare equal:

    _rolls = {
        {Username="User1", Roll=50, RankPrio=1},
        {Username="User2", Roll=2, RankPrio=3},
        {Username="User4", Roll=10, RankPrio=2},
        {Username="User5", Roll=9, RankPrio=2},
        {Username="User3", Roll=32, RankPrio=2}
    }
    
    table.sort(_rolls,
               function (a, b)
                 if a.RankPrio == b.RankPrio then
                   return b.Roll < a.Roll
                 else return b.RankPrio < a.RankPrio
                 end
    end)
    
    > table.inspect(_rolls)
    1 = 
        RankPrio = 3
        Username = User2
        Roll = 2
    2 = 
        RankPrio = 2
        Username = User3
        Roll = 32
    3 = 
        RankPrio = 2
        Username = User4
        Roll = 10
    4 = 
        RankPrio = 2
        Username = User5
        Roll = 9
    5 = 
        RankPrio = 1
        Username = User1
        Roll = 50