2013-04-11 2 views
0

태그 값을 기반으로 객체의 NSArray를 정렬 할 수 있기를 원합니다. 태그가 0이면 연결의 끝으로 밀어 넣으려고합니다.파생 된 값을 기반으로 NSArray를 정렬 ... 장애가 있습니까?

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:TRUE]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

NSArray *sortedArray = [self.array sortedArrayUsingDescriptors:sortDescriptors]; 

이렇게하면 색인 앞에 모든 태그가있는 객체가 반환됩니다 (꼭 그래야 함).

전방에 태그 값> 0을 넣고 끝에 0으로 모든 태그 값을 지정하고 싶습니다. 블록 일하는 것이 비록

I, 비슷한 : 나는 in another SO question을 발견

NSArray *sortedArray; 
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    NSDate *first = [(Person*)a birthDate]; 
    NSDate *second = [(Person*)b birthDate]; 
    return [first compare:second]; 
}]; 

,하지만 확실 어떻게 조건

if (obj.tag == 0) { 
    // push to end of array 
} 

어떤 제안을 추가하는?

답변

4

당신은 비교기 블록의 아이디어를 발견했습니다. 그 블록에서해야 할 일은 태그 0을 가진 객체가 다른 객체와 정렬된다는 것입니다.

sortedArray = [self.array sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    NSInteger first = [a tag]; 
    NSInteger second = [b tag]; 
    if (first == 0) { 
     return (second == 0 ? NSOrderedSame : NSOrderedDescending); 
    } 
    if (second == 0) { 
     return NSOrderedAscending; 
    } 
    if (first < second) { 
     return NSOrderedAscending; 
    } 
    if (first > second) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
}]; 
+2

첫 번째> 0, 두 번째 == 0이 올바르게 처리되지 않은 것으로 보입니다 (NSOrderedAscending을 반환해야 함). –

+0

Martin R은 정확합니다. 더 큰 샘플로 테스트했으며 태그 앞에 0이 여전히 붙습니다. – Padin215

+1

첫 번째 if-block 다음에'if (second == 0) return NSOrderedAscending;을 추가하십시오. –

0
// sort the part without tag = 0 
NSPredicate* p = [NSPredicate predicateWithFormat: @"tag != 0"]; 
NSSortDescriptor* sort = [NSSortDescriptor sortDescriptorWithKey: @"tag" ascending: YES]; 
NSMutableArray* result = [[[videos filteredArrayUsingPredicate: p] 
          sortedArrayUsingDescriptors: @[ sort ]] mutableCopy]; 

// append the part with tag = 0; 
p = [NSPredicate predicateWithFormat: @"tag = 0"]; 
[result addObjectsFromArray: [videos filteredArrayUsingPredicate: p]]; 

다른 접근법은 0없이 정렬 부분의 두 부분을 원래의 배열을 잇기 후 단부에 0을 가진 부분을 추가.

관련 문제