2015-01-12 2 views
5

알파벳 순으로 테이블을 정렬하고 싶습니다. 숫자 제외.숫자를 제외한 알파벳 순으로 테이블 정렬

아래의 코드는 테이블이 비교 기능을 정렬하는 방법을 보여줍니다

obj = { 
    [1] = { 
     ["N"] = "Green 1"; 
    }; 
    [2] = { 
     ["N"] = "Green 11"; 
    }; 
    [3] = { 
     ["N"] = "Green 2"; 
    }; 
    [4] = { 
     ["N"] = "Red 1"; 
    }; 
} 

하지만 그것은 다음과 같이 정렬하려면 :

function(a,b) return a.N < b.N end 

저를 제공

obj = { 
    [1] = { 
     ["N"] = "Green 1"; 
    }; 
    [2] = { 
     ["N"] = "Green 2"; 
    }; 
    [3] = { 
     ["N"] = "Green 11"; 
    }; 
    [4] = { 
     ["N"] = "Red 1"; 
    }; 
} 

가능합니까?

+0

제거 모든 숫자? 첫 단어 만 정렬 하시겠습니까? 테이블이 크거나 생성 작업을 수행하는 경우 "생성 키 정렬"캐시를 유지하는 것이 좋습니다. –

답변

3

이 게시물을 원래 게시 하겠지만 lhf가 게시 한 솔루션은 귀하의 질문에 답변했습니다. 여전히 문제가 있으니 다음을 시도해보십시오.

local function cmp(a, b) 
    a = tostring(a.N) 
    b = tostring(b.N) 
    local patt = '^(.-)%s*(%d+)$' 
    local _,_, col1, num1 = a:find(patt) 
    local _,_, col2, num2 = b:find(patt) 
    if (col1 and col2) and col1 == col2 then 
     return tonumber(num1) < tonumber(num2) 
    end 
    return a < b 
end 

local obj = { 
    { N = '1'   }, 
    { N = 'Green1'  }, -- works with optional space 
    { N = 'Green'  }, -- works when doesn't fit the format 
    { N = 'Sky blue99' }, 
    { N = 'Green 11' }, 
    { N = 'Green 2'  }, 
    { N = 'Red 02'  }, -- works when has leading zeros 
    { N = 'Red 01' }, -- works with padding spaces 
    { N = 'Sky blue 42' }, -- works with multi-word color names 
    { N = 99   }, -- works with numbers 
} 

table.sort(obj, cmp) 
for i,v in ipairs(obj) do 
    print(i, v.N) 
end 

인쇄 : 당신 정렬하기 전에 키에서

1 1 
2 99 
3 Green 
4 Green1 
5 Green 2 
6 Green 11 
7 Red 01 
8 Red 02 
9 Sky blue 42 
10 Sky blue99 
+0

감사합니다. 패턴을 다음과 같이 변경했습니다 :''(% D +) (% d +) $ '''{N ='Green1 '}'을 허용하려면, 작동하는 것처럼 보이지만 뭔가를 간과했을 수 있습니다. – Dreanh

+0

@Dreanh 그 패턴은 좋아 보이며 색상 이름에 숫자가 없으면 (. +) 모든 문자에 사용할 수 있습니다. – Adam

+0

감사합니다. ''^ (. +) (% d +) $ ''또는''(% g) (% d +) $ ''을 사용하면 작동하지 않습니다. – Dreanh

6

이 시도 : 당신은 "그린 1" "그린 02"또는 "그린과 비교하여 같은 코너 케이스를 처리해야하는 경우 고려해야 할 수도 있지만

local function split(a) 
    local x,y=a.N:match("(%S+)%s+(%S+)") 
    return x,tonumber(y) 
end 

table.sort(obj, 
    function (a,b) 
     local a1,a2=split(a) 
     local b1,b2=split(b) 
     return a1<b1 or (a1==b1 and a2<b2) 
    end 
) 
+0

감사합니다. 그것은 내가 원했던 것처럼 효과가있었습니다! – Dreanh

+0

문제가 생겼습니다. 테이블의 일부 문자열에 숫자가 없음을 언급하지 않았습니다. 그래서 나는 오류가 발생합니다. – Dreanh

+0

'a1 Dreanh

3

가 LHF의 솔루션은, 당신을 위해 작동합니다 @ 2 "는"Green 02 "로 표시됩니다. 영숫자 정렬을 구현하는 몇 가지 방법을 검토하고 그 결과를 blog post으로 비교했습니다. 바로이 주제에서 discussion on the lua mail list을 확인할 수도 있습니다.

관련 문제