문제

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가 권장하는 방법을 사용하여 배열을 정렬할 수 있는 가능성을 몰랐습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top