[sorting] Ordinare in modo associativo una tabella in base al valore in Lua


2 Answers

Come ha detto Komel, hai a che fare con gli array associativi, che non hanno ordini garantiti.

Se si desidera l'ordinamento delle chiavi in ​​base al valore associato, pur preservando la funzionalità dell'array associativo, è possibile fare qualcosa di simile:

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 è {1234,3188,1004,7007} e puoi accedere ai tuoi dati in questo modo:

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

risultato:

1234     bar     
3188     baz     
1004     foo     
7007     quux    
Question

Ho una chiave => tabella dei valori che vorrei ordinare in Lua. Le chiavi sono tutti numeri interi, ma non sono consecutive (e hanno un significato). L'unica funzione di ordinamento di Lua sembra essere table.sort , che tratta le tabelle come matrici semplici, scartando le chiavi originali e la loro associazione con elementi particolari. Invece, vorrei essenzialmente poter usare la funzione asort() di PHP .

Ciò che ho:

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

Cosa voglio dopo l'operazione di ordinamento:

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

Qualche idea?

Modifica: in base alle risposte, assumerò che si tratti semplicemente di una strana stranezza del particolare interprete Lua incorporato con cui sto lavorando, ma in tutti i miei test, pairs() restituisce sempre gli elementi della tabella nell'ordine in cui essi sono stati aggiunti al tavolo. (cioè le due dichiarazioni di cui sopra sarebbero iterate in modo diverso).

Sfortunatamente, poiché non è un comportamento normale, sembra che non riesca a ottenere ciò di cui ho bisogno; Lua non ha gli strumenti necessari incorporati (ovviamente) e l'ambiente embedded è troppo limitato perché io possa aggirarlo.

Comunque, grazie per il tuo aiuto, tutto!




Ho fatto un breve pezzetto di codice Lua un paio di anni fa, ma non sono più fluente in questo.

Di fronte a un problema simile, ho copiato il mio array in un altro array con chiavi e valori invertiti, quindi utilizzato sort sul nuovo array.

Non ero a conoscenza della possibilità di ordinare l'array usando il metodo raccomandato da Kornel Kisielewicz.




Gli array PHP sono diversi dalle tabelle Lua.

  • Un array PHP può avere un elenco ordinato di coppie chiave-valore.

  • Una tabella Lua contiene sempre un insieme non ordinato di coppie chiave-valore.

Una tabella Lua agisce come una matrice quando un programmatore sceglie di utilizzare gli interi 1, 2, 3, ... come chiavi. La sintassi della lingua e le funzioni della libreria standard, come table.sort offrono un supporto speciale per le tabelle con chiavi consecutive-intere.

Quindi, se vuoi emulare un array PHP, devi rappresentarlo usando l'elenco delle coppie chiave-valore, che è in realtà una tabella di tabelle, ma è più utile considerarlo come una lista di coppie chiave-valore . Passa una funzione personalizzata "meno di" a table.sort e sarai tutto pronto.

NB Lua consente di combinare tasti interi consecutivi con qualsiasi altro tipo di chiave nella stessa tabella e la rappresentazione è efficiente. Uso questa funzionalità a volte, di solito per taggare un array con alcuni pezzi di metadati.




Related