2016-05-07 4 views
4

Ich habe derzeit ein größeres Programm in LuaTeX (das ist eine TeX-Engine mit einem eingebauten Lua-Interpreter) und in einem Teil des Programms ist eine Tabelle sortiert. Die Tabellenelemente selbst sind Tabellen mit einer bestimmten Struktur und die Sortierfunktion sieht wie folgt aus:Lua Tabelle Sortierung behauptet ungültige Reihenfolge Funktion zum Sortieren

function sort_list_function (a,b) 

    if a.totalfilll < b.totalfilll then 
    return true 
    elseif a.totalfill < b.totalfill then 
    return true 
    elseif a.totalfil < b.totalfil then 
    return true 
    elseif a.totalvalue + a.height + a.totalplus < 
     b.totalvalue + b.height + b.totalplus 
    then 
    return true 
    else 
    return false 
    end  
end 

Alle Elementwerte Zahlen sind, so aus meinem Verständnis die Voraussetzung für die Vergleichsfunktion erfüllt sind, aber vielleicht aus meinem Denken ist here (was ist im Grunde die Frage, dh, warum oder unter welchen Umständen könnte die oben genannten in einer ungültigen Reihenfolge funktionieren Fehler).

Der Fehler ist leider nur sehr schwer zu isolieren und passierte nur einmal und dann erst nachdem der Code sehr viele Sortierungen erfolgreich durchgeführt hat, so möchte ich als ersten Schritt sichergehen, dass mir nicht ganz etwas fehlt eindeutig falsch mit einer Funktion wie oben.

+1

Hinweis: Betrachten Sie die Ergebnisse der beiden 'sort_list_function (a, b)' und 'sort_list_function (b, a)' für 'a = {totalfilll = 1, totalfill = 2}; b = {totalfilll = 2, totalfill = 1}; ' –

+0

@ColonThirtyTwo danke, also mag die angst richtig gewesen sein, brauche meine marmore poliert, so gibt es den weg beide richtungen in einem einfachen beispiel wahr zu bekommen, ich habe es einfach nicht gesehen –

Antwort

4

ok, danke an den Hinweis von @ColonelThirtyTwo, die Antwort ist, dass die Vergleichsfunktion in der Tat falsch ist und ich muss auch explizit die > Fälle behandeln und sofort false zurückgeben (wie in meinem Fall die verschiedenen Tests gemeint sind) von unterschiedlicher Reihenfolge der Wichtigkeit) zum Beispiel so etwas wie

if a.totalfilll < b.totalfilll then 
    return true 
    elseif a.totalfilll > b.totalfilll then 
    return false 
    elseif a.totalfill < b.totalfill then 
    return true 
    elseif a.totalfill > b.totalfill then 
    return false 
    elseif a.totalfil < b.totalfil then 
    return true 
    elseif a.totalfil > b.totalfil then 
    return false 
    else 
    return (a.totalvalue + a.height + a.totalplus < 
      b.totalvalue + b.height + b.totalplus ) 
    end