Lua에서 값을 기준으로 테이블을 연관적으로 정렬하기
문제
Lua에서 정렬하고 싶은 키 => 값 테이블이 있습니다.키는 모두 정수이지만 연속적이지 않으며 의미도 있습니다.Lua의 유일한 정렬 기능은 다음과 같습니다. table.sort
, 테이블을 단순 배열로 처리하고 원래 키와 특정 항목과의 연관을 삭제합니다.대신 본질적으로 다음을 사용할 수 있기를 바랍니다. PHP의 asort()
기능.
내가 가진 것:
items = {
[1004] = "foo",
[1234] = "bar",
[3188] = "baz",
[7007] = "quux",
}
정렬 작업 후 내가 원하는 것:
items = {
[1234] = "bar",
[3188] = "baz",
[1004] = "foo",
[7007] = "quux",
}
어떤 아이디어가 있나요?
편집하다: 답변을 바탕으로 저는 이것이 제가 작업하고 있는 특정 내장형 Lua 인터프리터의 이상한 문제일 뿐이라고 가정하겠습니다. 하지만 모든 테스트에서 pairs()
항상 테이블에 추가된 순서대로 테이블 항목을 반환합니다.(즉.위의 두 선언은 다르게 반복됩니다.
안타깝게도 이는 정상적인 동작이 아니기 때문에 필요한 것을 얻을 수 없는 것 같습니다.Lua에는 (물론) 필요한 도구가 내장되어 있지 않으며 내장 환경이 너무 제한되어 있어서 제가 해결할 수 없습니다.
그래도 여러분의 도움에 감사드립니다!
해결책
뭔가 잘못 이해하고 있는 것 같습니다.여기에 있는 것은 연관 배열.연관 배열에는 명시적인 순서가 없습니다.순서를 지정하는 것은 내부 표현(보통 정렬됨)뿐입니다.
간단히 말해서, Lua에서는 게시한 두 배열 모두 다음과 같습니다. 똑같다.
대신에 원하는 것은 다음과 같은 표현입니다.
items = {
{1004, "foo"},
{1234, "bar"},
{3188, "baz"},
{7007, "quux"},
}
지금은 색인으로 가져올 수 없지만(인덱스는 1, 2, 3, 4로 지정되어 있지만 ~할 수 있다 다른 인덱스 배열 생성), 다음을 사용하여 정렬할 수 있습니다. table.sort
.
그러면 정렬 기능은 다음과 같습니다.
function compare(a,b)
return a[1] < b[1]
end
table.sort(items, compare)
다른 팁
Komel이 말했듯이 순서가 보장되지 않는 연관 배열을 다루고 있습니다.
연관 배열 기능을 유지하면서 연관된 값을 기반으로 키 순서를 지정하려면 다음과 같이 할 수 있습니다.
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}이며 다음과 같이 데이터에 액세스할 수 있습니다.
for _, key in ipairs(sortedKeys) do
print(key, items[key])
end
결과:
1234 bar
3188 baz
1004 foo
7007 quux
흠, 반복을 제어할 수 없다는 부분이 빠졌네요.거기
그러나 루아에는 대개 항상 방법이 있습니다.
http://lua-users.org/wiki/OrderedAssociativeTable
이제 시작이다.이제 라이브러리가 사용하는 pair()를 바꿔야 합니다.이는 pair=my_pairs와 같이 간단할 수 있습니다.그런 다음 위 링크의 솔루션을 사용할 수 있습니다.
PHP 배열은 Lua 테이블과 다릅니다.
PHP 배열은 주문 목록 키-값 쌍.
Lua 테이블에는 항상 다음이 포함됩니다. 정렬되지 않은 세트 키-값 쌍.
Lua 테이블은 프로그래머가 정수 1, 2, 3, ...을 사용하도록 선택할 때 배열 역할을 합니다.열쇠로.언어 구문과 표준 라이브러리 함수 table.sort
연속된 정수 키가 있는 테이블에 대한 특별한 지원을 제공합니다.
따라서 PHP 배열을 에뮬레이션하려면 키-값 쌍 목록(실제로는 테이블의 테이블)을 사용하여 표현해야 하지만 키-값 쌍 목록으로 생각하는 것이 더 도움이 됩니다. .사용자 정의 "보다 작음" 함수를 전달합니다. table.sort
그러면 모든 준비가 완료됩니다.
NBLua를 사용하면 다음을 수행할 수 있습니다. 혼합 연속된 정수 키와 다른 종류의 키 같은 테이블 - 표현이 효율적입니다.저는 가끔 이 기능을 사용하는데, 일반적으로 몇 가지 메타데이터로 배열에 태그를 지정합니다.
몇 달 후에 같은 질문으로 이 문제가 발생합니다.권장 답변은 필요한 것과 이것이 LUA에서 어떻게 보이는지 사이의 차이를 정확히 지적하는 것처럼 보였지만 제가 정확히 원하는 것을 얻지 못했습니다. 키별로 정렬된 해시였습니다.
그러나 이 페이지의 처음 세 가지 기능은 다음과 같습니다. http://lua-users.org/wiki/SortedIteration
몇 년 전에 Lua 코딩을 잠깐 해봤지만 더 이상 능숙하지 않습니다.
비슷한 문제에 직면했을 때 내 배열을 키와 값이 반대인 다른 배열에 복사한 다음 사용했습니다. sort
새 어레이에.
Kornel Kisielewicz가 권장하는 방법을 사용하여 배열을 정렬할 수 있는 가능성을 몰랐습니다.