2010-01-10 12 views
18

Mam klucz => tabela wartości Chciałbym sortować w Lua. Wszystkie klucze są liczbami całkowitymi, ale nie są kolejne (i mają znaczenie). Jedyną funkcją sortowania Lua wydaje się być table.sort, która traktuje tabele jako proste tablice, odrzucając oryginalne klucze i ich powiązanie z określonymi elementami. Zamiast tego zasadniczo chciałbym móc korzystać z funkcji PHP's asort().Asocjatywne sortowanie tabeli według wartości w Lua

Co mam:

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

Chcę po operacji sortowania:

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

jakieś pomysły?

EDIT: Na podstawie odpowiedzi, mam zamiar założyć, że jest to po prostu dziwne dziwactwo konkretnego wbudowanego interpretera Lua ja pracuję, ale we wszystkich moich testów pairs() zawsze zwraca pozycje w tabeli kolejność, w jakiej zostały dodane do tabeli. (tj. dwie powyższe deklaracje miałyby być różnie powtarzane).

Niestety, ponieważ nie jest to normalne zachowanie, wygląda na to, że nie mogę uzyskać tego, czego potrzebuję; Lua nie ma wbudowanych niezbędnych narzędzi (oczywiście), a środowisko osadzone jest zbyt ograniczone, abym mógł je obejść.

Mimo wszystko dziękuję za pomoc!

+7

te dwie tabele są dokładnie takie same. – lhf

Odpowiedz

35

Wydajesz się źle zrozumieć coś. To, co tu masz, to associative array. Tablice asocjacyjne nie mają na nich wyraźnej kolejności, np. to tylko wewnętrzna reprezentacja (zwykle posortowana) zamawia je.

Krótko mówiąc - w Lua obie tablice, które wysłałeś, to: to samo.

Co chcesz w zamian, jest taka reprezentacja:

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

Chociaż nie można dostać je teraz indeksu (są one indeksowane 1, 2, 3, 4, ale mogą tworzyć inną tablicę indeksów), możesz sortować je za pomocą table.sort.

Funkcja sortowania byłoby wówczas:

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

table.sort(items, compare) 
+1

To nie wydaje się być prawdziwe dla Lua, przez moje testy. Podczas iteracji nad tabelą za pomocą 'pairs()', kolejność jest stabilna i odpowiada kolejności dodawania elementów. Ponadto nie mam możliwości zmiany sposobu przechowywania danych; Podaję wynik do biblioteki 3rd party, która wyświetla elementy użytkownikowi w "' pairs() 'order". –

+2

Wątpię, czy znajdziesz sposób na zmianę zamówienia - jest to problem reprezentacji ... –

+3

pary zwracają dane w kolejności mieszania - mogą być stabilne - ale nie jest to kolejność, w której elementy zostały dodane. From lua-users wiki "Uwaga: nie ma gwarancji co do kolejności, w jakiej klucze będą przechowywane w tabeli podczas korzystania ze słowników, więc kolejność pobierania kluczy przy użyciu par() nie jest gwarantowana.To zastrzeżenie ma zastosowanie nawet do indeksowanej części tabeli lub do tabeli, która w ogóle nie jest używana jako słownik i ma tylko indeksy jako klucze. " – sylvanaar

1

Zrobiłem krótki kawałek Lua kodowania kilka lat temu, ale już nie jestem biegły w nim.

W obliczu podobnego problemu skopiowałem tablicę do innej tablicy z odwróconymi kluczami i wartościami, a następnie użyłem sort w nowej tablicy.

Nie wiedziałem o możliwości sortowania tablicy przy użyciu metody zalecanej przez Kornela Kisielewicza.

6

hmm, brakowało części o tym, że nie można kontrolować iteracji. tam

Ale w Lua zwykle jest sposób.

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

Ów początek.Teraz musisz zastąpić pary() używane przez bibliotekę. To może być symetria jako pary = moje_parki. Następnie można użyć rozwiązania w łączu powyżej

3

Macierze PHP różnią się od tabel Lua.

  • php tablica może mieć uporządkowaną listę par wartości klucza.

  • Tabela Lua zawsze zawiera nieuporządkowany zbiór par klucz-wartość.

Tabela Lua działa jak tablica, gdy programista wybiera liczbę całkowitą 1, 2, 3, ... jako klucze. Składnia języka i standardowe funkcje biblioteki, takie jak table.sort, oferują specjalne wsparcie dla tabel z kolejnymi liczbami całkowitymi.

Tak więc, jeśli chcesz emulować tablicę PHP, musisz ją reprezentować za pomocą listy par klucz-wartość, która jest w rzeczywistości tabelą tabel, ale lepiej jest myśleć o niej jako o liście pary klucz-wartość. Przekaż niestandardową funkcję "mniej niż" do table.sort, a wszystko będzie gotowe.

N.B. Lua pozwala na wymieszać kolejne klucze z innymi rodzajami kluczy w tym samym tabeli — i reprezentacja jest wydajna. Używam tej funkcji czasami, zwykle do oznaczania tablicy kilkoma kawałkami metadanych.

3

Przyjdzie do tego kilka miesięcy później, z tym samym zapytaniem. Zalecana odpowiedź zdaje się wskazywać na lukę między tym, co było wymagane, a tym, jak to wygląda w LUA, ale nie dostarczyło mi dokładnie tego, o co mi chodziło: - co było hasłem posortowanym według klucza.

Pierwsze trzy funkcje na tej stronie DID jednakże: http://lua-users.org/wiki/SortedIteration

+0

Ale to jest właśnie problem odwrotny: to pytanie jest ** sortuj według wartości **. Twoja odpowiedź brzmi ** sortuj według klucza **. – bluenote10

7

Jak powiedział Komel, masz do czynienia z asocjacyjnych, które nie mają zagwarantowane zamówieniu.

Jeśli chcesz klucz zamawianie na podstawie związanej z nią wartości przy jednoczesnym zachowaniu funkcjonalności tablicy asocjacyjnej, można zrobić coś takiego:

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 jest {1234,3188,1004,7007}, i można dostęp do danych tak:

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

wynik:

1234  bar  
3188  baz  
1004  foo  
7007  quux  
+0

Właśnie uratowałeś mój dzień, zmagałam się z porządkami stołu jak w rankingach gra od wielu godzin. – Tosfera

Powiązane problemy