Frage

Ich habe einen Schlüssel => Wert Tabelle Ich mag würde in Lua sortieren. Die Tasten sind alle ganzen Zahlen, aber nicht aufeinander folgen (und Bedeutung haben). Lua nur Sortierfunktion erscheint table.sort , die behandelt werden Tabellen als einfache Arrays, die Original-Schlüssel und ihre Verbindung mit bestimmten Artikeln zu verwerfen. Stattdessen würde ich im Wesentlichen wie in der Lage seine Funktion nutzen PHP asort() .

Was ich habe:

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

Was ich will, nach dem Sortiervorgang:

items = {
    [1234] = "bar",
    [3188] = "baz",
    [1004] = "foo",
    [7007] = "quux",
}

Irgendwelche Ideen?

Edit: Basierend auf den Antworten, ich gehe davon aus, dass es einfach eine ungerade Marotte des jeweiligen Lua eingebetteten Interpreter arbeite ich mit, aber in allen meinen Tests, pairs() immer zurückkehrt Tabelle Elemente in der Reihenfolge in der sie in der Tabelle hinzugefügt. (Das heißt, die beiden oben genannten Erklärungen würden iterieren anders).

Leider, denn das ist nicht ein normales Verhalten, es sieht aus wie ich nicht bekommen kann, was ich brauche; Lua nicht über die notwendigen Werkzeuge eingebaut (natürlich) und die eingebettete Umgebung auch für mich zu arbeiten um ihn herum beschränkt ist.

Dennoch vielen Dank für Ihre Hilfe, alle!

War es hilfreich?

Lösung

Sie scheinen falsch zu verstehen etwas. Was Sie hier sehen, ist ein assoziatives Array . Assoziative Arrays haben keine explizite Reihenfolge auf sie, zum Beispiel es ist nur die interne Darstellung (in der Regel sortiert), dass Aufträge sie.

Kurz gesagt - in Lua, die beide den Arrays Sie auf dem Laufenden sind die gleiche

.

Was würden Sie stattdessen wollen, ist eine solche Darstellung:

items = {
    {1004, "foo"},
    {1234, "bar"},
    {3188, "baz"},
    {7007, "quux"},
}

Während Sie diese nicht durch den Index jetzt bekommen können (sie sind 1 indiziert, 2, 3, 4, aber Sie können erstellen Sie einen anderen Index-Array), können Sie sie sortieren table.sort verwenden.

Eine Sortierfunktion wäre dann:

function compare(a,b)
  return a[1] < b[1]
end

table.sort(items, compare)

Andere Tipps

Wie Komel sagte: Sie sind den Umgang mit assoziativen Arrays, die keine Bestellung garantiert haben.

Wenn Sie Schlüssel Bestellung wollen, basierend auf seinem Wert zugehörigen während auch assoziative Array Funktionalität zu bewahren, können Sie etwas tun:

function getKeysSortedByValue(tbl, sortFunction)
  local keys = {}
  for key in pairs(tbl) do
    table.insert(keys, key)
  end

  table.sort(keys, function(a, b)
    return sortFunction(tbl[a], tbl[b])
  end)

  return keys
end

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

local sortedKeys = getKeysSortedByValue(items, function(a, b) return a < b end)

sortedKeys ist {1234,3188,1004,7007}, und Sie können Ihre Daten zugreifen wie folgt:

for _, key in ipairs(sortedKeys) do
  print(key, items[key])
end

Ergebnis:

1234     bar     
3188     baz     
1004     foo     
7007     quux    

hmm, verpassten den Teil über nicht in der Lage ist, um die Iteration zu steuern. dort

Aber in lua gibt es in der Regel immer einen Weg.

http://lua-users.org/wiki/OrderedAssociativeTable

Das ist ein Anfang. Jetzt müssen Sie die Paare (), dass die Bibliothek verwendet ersetzen. Das könnte ein simples als Paare = my_pairs sein. Sie könnten dann über die Lösung in der Verbindung verwenden

PHP Arrays unterscheiden sich von Lua Tabellen.

  • A PHP-Array kann eine haben geordnete Liste von Schlüssel-Wert-Paaren.

  • Ein Lua Tabelle enthält immer eine ungeordnete Menge von Schlüssel-Wert-Paaren.

A Lua Tabelle wirkt als ein Array, wenn ein Programmierer 1 ganzen Zahlen zu verwenden, wählt, 2, 3, ... als Schlüssel. Die Sprachsyntax und Standard-Bibliotheksfunktionen, wie table.sort bieten spezielle Unterstützung für Tabellen mit aufeinanderfolgenden ganzzahligen Tasten.

Wenn Sie also einen PHP-Array emulieren wollen, müssen Sie es mit Liste von Schlüssel-Wert-Paaren vertreten haben, die wirklich eine Tabelle von Tabellen sind, aber es ist hilfreich, daran zu denken als eine Liste von Schlüsseln -Wertes Paaren. Führen Sie eine benutzerdefinierte „weniger als“ -Funktion table.sort und Sie werden ganz eingestellt werden.

N. B. Lua können Sie mischen aufeinanderfolgende ganzzahlige Schlüssel mit allen möglichen anderen Arten von Schlüsseln in der gleichen Tisch und die Darstellung ist effizient. Ich benutze diese Funktion manchmal, in der Regel ein Array mit ein paar Stücke von Metadaten zu markieren.

Kommen dazu ein paar Monate später, mit der gleichen Abfrage. Die empfohlene Antwort schien die Lücke zwischen zu lokalisieren, was erforderlich war, und wie das aussieht in LUA, aber es hat mich nicht, was ich war nach genau: -. Das war ein Hash von Key sortierte

Die ersten drei Funktionen auf dieser Seite DID jedoch: http://lua-users.org/wiki/ SortedIteration

Ich habe ein kurzes Stück Lua ein paar Jahre Codierung vor, aber ich bin nicht mehr fließend es.

Wenn Sie mit einem ähnlichen Problem konfrontiert, kopierte ich meine Array zu einem anderen Array mit Schlüsseln und Werten umgekehrt, dann sort auf das neue Array verwendet.

war ich von der Möglichkeit nicht bewusst, um das Array zu sortieren, mit der Methode kornel kisielewicz empfiehlt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top