2013-09-26 2 views
5

내가보기에 내 문제에 충분히 가깝다고 여겨지는 제목을 찾았을 때 나는 여기에 답을 많이 읽었습니다. 나는 정확한 문제가있는 사람을 보지 못했기 때문에 단순한 사실에 무지하다는 희망을 묻고있다.루아 테이블 정렬 2 비교

HP (int)와 거리 (부울)를 기록한 테이블을 코딩 한 다음 Range에있는 맨 위에있는 HP 만 정렬하려고합니다.

local tableTest = { 
    {hp = 64, range = true, name="Frank"}, 
    {hp = 100, range = true, name="Joe"}, 
    {hp = 2, range = false, name="Jim"}, 
    {hp = 76, range = true, name="Tim"}, 
    {hp = 17, range = false, name="Jill"}, 
    {hp = 16, range = true, name="Phillip"}, 
} 

-- Sort by HP and Range to find lowest Unit in Range. 
table.sort(tableTest, function(x,y) return x.hp < y.hp and x.range end) 

for i=1, #tableTest do print(tableTest[i].name, tableTest[i].hp) end 

이의 출력은 다음과 같습니다

Phillip 16 
Jim  2 
Frank 64 
Jill 17 
Tim  76 
Joe  100 

나는이에서 예상 된 출력은 다음과 같습니다

Phillip 16 
Frank 64 
Tim  76 
Joe  100 
Jim  2 
Jill 17 

나는 이것이 얼마나의 내 부분에 오해기도 table.sort는 이와 같은 여러 검사를 사용합니다 (이 변수를 선언하는 방법에 더 가깝다고 가정했습니다).

편집 추가 정보 - 나는 range=false 인덱스가 테이블에있는 위치의 순서를 변경하는 경우, 출력의 변화뿐만 아니라 (여전히 올바르지). 값은 정렬 후에 서로 다른 색인으로 정렬됩니다.

답변

4

귀하의 설명에 따르면 귀하의 주문 기능은 먼저 range을 비교 한 다음 hp을 비교해야합니다.

table.sort(tableTest, function(x,y) 
          if x.range and y.range then return x.hp < y.hp 
          elseif x.range then return true 
          elseif y.range then return false 
          else return x.hp < y.hp end 
         end) 

어쩌면 더 짧은 버전이있을 수 있지만이 동작은 확실하고 논리는 분명합니다.

+0

ty ty! 나는 내가 잘못한 것을 좀 이해한다고 생각한다. 저는 진정한 진실 만의 관점에서 생각하고있었습니다. 따라서 이것을 올바르게 이해한다면 나는이 권리를 확실히 읽고 싶습니다. 먼저 두 범위가 모두 맞는지 확인한 다음 HP 기준으로 정렬합니다. 두 범위가 모두 참이 아니면 x가 실제 범위를 가지는지 확인한 다음 true를 반환하고 그렇지 않으면 y가 범위를 갖고 false를 반환합니다. 둘 다 false이면 HP가 범위를 벗어난 값을 정렬합니다. 테스트에서 실패한 부분은 elseif y.range false입니다. y 값을 올바르게 정렬 할 수 있도록이 작업을 수행합니까? – Bubba911

+0

@ Bubba911이 경우'x.range'는'false'이고'y.range'는'true'이므로'x'는'hp'의 값에 상관없이'y' 다음에 있어야합니다. –

+0

Ty : 내 마음은 여전히 ​​그 주위에 감싸고 있었다. 구두로 나에게 큰 소리로 모두 말한 후에, 내가 말한 것은 (게시 한 후) 내가 생각한 것입니다. 그래서 그것은 내 이해가 정확하다는 것을 듣는 것이 대단합니다! 다시 한번 감사드립니다, 좋은 하루 되시길 바랍니다. – Bubba911

0

이미이 질문에 대한 답변을 얻었으나이 논리에 대해 더 쉽게 추론 할 수있는 방법을 다루는 다른 설명을 추가 할 가치가 있다고 생각합니다. 여기에 제시된 아이디어는 실제로 언어에 구애받지 않습니다.

비교 기능을 제공하는 목적은 정말 하나의 질문에 대답하는 것입니다 : XY 앞에 와야 하는가? 같은 질문을하는 또 다른 방법은 x이 우선 순위가 더 높습니다. y? 종종 < 연산자와 같은 순서 지정 속성을 사용하여이를 구현합니다. 확실히 Y앞에 true X 경우

그래서 함수가 반환해야합니다. 귀하의 경우 실제로 range 필드로 정렬하고 두 경우 모두 일 경우 hp 필드를 "타이 브레이커"로 사용하십시오.

당신은 당신이 찾고있는 동작 산출 논리 상태를 표현하는 가장 간결한 방법으로 찾을 수 있도록 여기에 진실 테이블을 구성 할 수 있습니다 :

x | y | x before y? 
------------------------- 
    T | T | x.hp < y.hp 
    T | F | T 
    F | T | F 
    F | F | F 

원래 상태를 x.hp < y.hp and x.range 가까이는 아니지만 꽤 가능한 모든 경우를 수정하십시오.

우리가 X이 false 인 경우 다음 최종 결과에 관계없이 Y가 무엇인지 또한 거짓 인 것을 알 수 위. 따라서 yx이 참일 때만 고려됩니다. 마지막으로, lua의 논리 단락에서 잘못된 조건의 경고를 피하기 위해 x.hp < y.hp이 논리적 표현의 끝에 있어야합니다. 따라서 찾고자하는 논리 조건은 다음과 같습니다.

return x.range and (not y.range or x.hp < y.hp)