2010-02-24 4 views
0

나는 3 가지 정렬 옵션 인 quality, quatity 및 a가 다른 객체와 비교하여 그 순서로 정렬 된 객체가 있습니다. 방법 객체가 동일한 품질과 수량이있는 경우 순환 비교가 발생할 수 있습니다, 나는 그 경우에 어떤 정렬 순서를 반환 할 :순환 비교를 사용하여 배열 정렬

- (NSComparisonResult) compare: (MyObject *) obj { 
if (self.quality > obj.quality) 
return NSOrderedAscending; 
else if (self.quality < obj.quality) 
return NSOrderedDescending; 

if (self.quantity > obj.quantity) 
return NSOrderedAscending; 
else if (self.quantity < obj.quantity) 
return NSOrderedDescending; 

if ([self betterThan: obj]) 
return NSOrderedAscending; 

if ([obj betterThan: self]) 
return NSOrderedDescending; 

return NSOrderedSame; 
} 

내 문제는 betterThan는 점이다. 예를 들어

, A, B 및 C는 동일한 품질/수량이 있지만

A betterThan: B => YES 
B betterThan: C => YES 
C betterThan: A => YES 

솔루션? 감사.

답변

0

가 좋아, 내가 버그 정렬과는 아무 상관이 없었다 발견 (비록 그것이 그것으로 인한 것 같았지만).

분명히 실제로 작동합니다. 교착 상태가 발생하면 시스템이 정렬을 중지합니다.

시간 내 주셔서 감사합니다. :)

0

betterThan: 메서드는 NSOrderedSame이어야합니다. NSComparisonResult을 반환하는 모든 메서드는 항상 세 가지 옵션을 모두 반환 할 수 있어야합니다. 비교 한 세 가지 결과 중 하나이지만에만 검사를해야하기 때문에 당신은 항상 IF-의 방법에서 반환합니다

if (self.quality > obj.quality) 
    return NSOrderedAscending; 
else 
    return NSOrderedDescending; //<== returns for both self.quality > obj.quality AND self.quality == obj.quality 

:

귀하의 방법은 첫째 경우 - 블록 과거에 합격하지 않습니다 블록. 다른 논리는 사용되지 않습니다.

필터링 논리를 얻으려면 if 블록을 중첩해야합니다. 그들이 더 크고 더 작 으면 테스트하고 돌아 오지만 똑같 으면 다음 테스트로 넘어갑니다. 필요에 따라 반복하십시오.

- (NSComparisonResult) compare: (MyObject *) obj { 
    if (self.quality > obj.quality) 
     return NSOrderedAscending; 
    else if (self.quality < obj.quality) 
     return NSOrderedDescending; 
    else { 
     if (self.quantity > obj.quantity) 
      return NSOrderedAscending; 
     else if (self.quantity < obj.quantity) 
      return NSOrderedDescending; 
     else { 
      ... and so on 
     } 
    } 

각 속성 비교에는 고유 한 방법이 있어야한다고 생각합니다. 그런 다음 클래스의 두 객체를 포괄적으로 비교해야하는 경우이를 하나의 비교 대상으로 결합 할 수 있습니다.

이 경우에는 betterThan: 방법이 실제 수업과 비교되는 것처럼 보입니다.

+0

네가 맞아, 나는 그 코드를 서둘러 썼다. 나는 그것을 고쳤다 :) 그러나, 다른 모든 비교를 제거하고 betterThan와 달라 붙는다 : 나의 유일한 비교로서, 내가 얻었던 모두는 부서지기 때문에 멈추지 않을 것이기 때문에, 나는 믿는다. 나는 디버거로부터 어떤 결과도 얻지 못하므로, 정말로 말할 수는 없다. –

0

귀하의 코드와 귀하의 질문에 대해 다소 혼란 스럽습니다. 비교 기능은 품질 만 비교합니다 (둘 중 첫 번째 분기의 분기가 반환됩니다). 당신은 단지에 betterThan을 사용하려는 경우처럼 뭔가를 할 것 (무엇을 당신의 직면은 문제 ... 인 나는 생각한다) 비교 :

- (NSComparisonResult) compare: (MyObject *) obj { 
    if ([self betterThan: obj]) 
     if ([obj betterThan: self]) 
      return NSOrderedSame 
     else 
      return NSOrderedAscending; 
    else 
     return NSOrderedDescending 
} 
+0

나는 두 가지 사물이 결코 서로 나아지지 않도록 예방 조치를 취했다. 그래서 서로 상황이 그렇게되지 않을 것이다. 그러나, 일어날 수있는 3 개의 목표를 위해. 정렬 함수는 한 번에 2 개의 객체를 가져 와서 비교 함수를 사용하여 비교합니다. 위에서 설명한 3 가지 객체 (A, B, C)의 경우 디버거 출력없이 응용 프로그램이 중단됩니다. –