2013-04-21 2 views
2

이것은이 게시물을 어떻게 작성합니까? 아닙니다. 대신, 어떻게 작동하는지 그리고 다른 사람들도 배울 수 있기를 바랍니다.Obj C에서 블록 비교기는 어떻게 작동합니까?

이 예제에서는 NSMutableArray에 NSDecimalNumber 개체가있는 경우를 가정 해 보겠습니다. 안의 객체가 특별한 순서없이 [-464.50, +457.20, 0, -1000]이라고 가정 해 봅시다. 그것들을 비교하기 전에 나는 그것들에 절대 값을 적용한다.

제 코드에서는 sortUsingComparator 메서드를 사용하고 블록을 지정합니다. 나는 다른 조건을 테스트하고 여기에 그들이 jQuery과에 제시되어 같은 결과 시작일 :

return [person1Amount compare:person2Amount]; 
==> 0, 457.20, -464.50, -1000 

, 경우

return [person2Amount compare:person1Amount]; 
==> -1000, -464.50, +457.42, 0 

compare: 방법은 실제로 작동 않는 방법

. NSDecimalNumber 의사 here은 실제로 나에게 설명하지 않습니다. 이 부분은 특히 나를 혼란 :

반환 값 NSOrderedAscending decimalNumber의 값이 수신기보다 큰 경우; NSOrdered 동등한 지 여부 decimalNumber의 값이 리시버보다 작 으면 NSOrderedDescending입니다.

배열 안의 개체 순서에 따라 정렬 방법이 결정됩니다. 예를 들어 person1.number < person2.number 인 경우 배열을 오름차순으로 정렬합니까? 내 코드 [person2Amount compare:person1Amount]이 올바른 결과를 얻는 이유는 무엇입니까?

person2Amount is < person1Amount처럼 보이며 따라서 내림차순으로 정렬하지만 person2Amount is > person1Amount 인 경우 정렬이 오름차순입니까?

내 이해가 옳지 않은 것처럼 보입니다.

감사합니다.

답변

1

절대 값을 비교하므로 부호를 무시하십시오. 귀하의 숫자는 464.50, 457.20, 0 및 1000입니다. 오름차순은 숫자가 커짐을 의미하므로 순서는 0, 457.20, 464.50, 1000이됩니다. 내림차순은 크기가 작아 지므로 1000, 464.50, 457.20, 0

비교기를 사용하면 비교기에 따라 배열이 오름차순으로 정렬됩니다. 비교기에 쌍의 값을 전송합니다. 콤퍼레이터가 오름차순으로 반환하면 첫 번째를 먼저 배치합니다. 내림차순으로 반환하면 두 번째를 먼저 배치합니다. 결과는 것입니다, 당신의 비교기는 [number1 compare:number2] 호출하는 경우,

- (NSComparisonResult)compare:(NSNumber *)number2 { 
    if(self < number2) return NSOrderedAscending; 
    if(self > number2) return NSOrderedDescending; 
    return NSOrderedSame; 
} 

따라서 :

의 NSNumber compare: 방법은 다음과 같이 기본적으로 작동합니다 (물론 당신이 NSNumbers에 ><를 사용할 수 있지만 생각) 숫자가 오름차순 인 경우 오름차순 (숫자 1이 더 작음)입니다. 즉, 숫자가 오름차순 일 때 배열에서 오름차순으로 유지됩니다. 콤퍼레이터가 [number2 compare:number1] 스위치를 전환하면 숫자가 내림차순이면 (숫자 2가 작 으면) 결과가 오름차순으로 표시되므로 전환되고 배열에서 내림차순이됩니다.

+0

아직 이해가 안됩니다. 예제를 사용합시다. 위의 배열 [464.50, 457.20, 0, 1000]에 대해 오름차순 정렬을 원합니다. [number1 compare : number2]. 첫 번째 쌍은 [464.50 비교 : 457.20]입니다. 비교 방법을 살펴보면 self는 number1이므로 statement (self> number2)에서 464.50이 457.20보다 크기 때문에 true를 반환하고 NSOrderedDescending을 반환합니다. 그러나 [number1 compare : number2]는 배열을 오름차순으로 반환합니다. 그것이 내가 얻지 못하는 것입니다. 아마 단어에 연극이 있지만 그것은 나에게 혼란 스럽습니다. – okysabeni

+0

@Yko 비교는 내림차순을 반환하고 배열은 항상 비교 자의 결과에 따라 오름차순을 사용하므로 내림차순으로 반환하면 배열 순서를 전환하도록 지시합니다. 정렬의 각 단계를 적어보십시오. 먼저 첫 번째 쌍을 비교하고 결과가 내림차순이면 전환하십시오. 스위칭을 멈출 때까지 쌍을 계속하십시오. – ughoavgfhw

+0

"배열은 항상 비교 자의 결과에 따라 오름차순을 사용합니다"는 의미는 무엇입니까? 따라서 첫 번째 쌍은 number2> number1 이후 NSOrderedDescending을 반환합니다. 그런 다음 해당 비교자를 기반으로 배열은 오름차순으로 배열을 반환하므로 배열은이를 [number1 number2]와 같이 재정렬합니다. 내가 [person2 compare : person1]과 같이 설정하면 NSOrderedAscending을 반환합니다. "배열은 오름차순을 사용합니까"는 의미는 무엇입니까? 혼자서 떠나는 것은 이미 오름차순입니까? 그러면, 그것은 맞는 [person2 person1]이 될 것입니다. 내가 여기있는 결론을 확인해 주시겠습니까? – okysabeni

2

고객님의 질문에 답변하신 것 같습니다. 대

return [person2Amount compare:person1Amount]; 

return [person1Amount compare:person2Amount]; 

는 위의 두 문장을 고려; compare: 메서드는 두 개체 중 어느 개체가 다른 개체보다 큰지에 따라 NSOrderedAscending 또는 NSOrderedDescending을 반환합니다.

당신이 할 것 인 경우 : 그런 다음 당신이 명백한 이유를해야한다 무엇을 NSOrderedAscendingNSOrderedDescending을받은 것

return [@2 compare:@1]; 

return [@1 compare:@2]; 

대.

따라서 사용자가 compare: 메서드를 구현하고 위의 @ 1과 @ 2의 경우와 같이 비교할 두 개체를 전환하면 배열의 정렬 순서가 효과적으로 바뀝니다.

+0

나에게 분명하지 않습니다. 예제를 사용합시다 : 위의 배열 [464.50, 457.20, 0, 1000]에 대해 오름차순 정렬을 원합니다. [number1 compare : number2]. 첫 번째 쌍은 [464.50 비교 : 457.20]입니다. compare 메소드를 살펴보면 self는 number1이므로 statement (self> number2)에서 464.50이 457.20보다 크기 때문에 true를 반환하고 NSOrderedDescending을 반환합니다. 그러나 [number1 compare : number2]는 배열을 오름차순으로 반환합니다. 그것이 내가 얻지 못하는 것입니다. 아마 단어에 연극이 있지만 그것은 나에게 혼란 스럽습니다. – okysabeni