2016-11-02 4 views
1

숫자와 문자열 배열이 있습니다. 같은숫자와 문자열의 배열 정렬

NSArray* list = @[@"9", @"21", @"A 2-5", @"19-1", @"10", @"D 7-10", @"13-2"]; 

나는이 배열은

@[@"9", @"10", @"21", @"13-2", @"19-1", @"A 2-5", @"D 7-10"]; 

으로 분류하고자하지만

[list sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { 
    return [obj1 compare:obj2]; 
}]; 

를 사용하는 경우 내가

를 사용하는 경우 나도 비슷한 결과를 얻을

@[@"10", @"13-2", @"19-1", @"21", @"9", @"A 2-5", @"D 7-10"]; 

를 얻을 수

[list sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

예상 한대로 결과를 얻으려면 어떻게해야합니까?

+2

'return [obj1 compare : obj2 options : NSNumericSearch];'를 사용하십시오. – rmaddy

+0

더 나은 (y). – x4h1d

답변

1

오른쪽 트랙에 sortedArrayUsingComparator으로있었습니다.

NSArray* list = @[@"9", @"21", @"A 2-5", @"19-1", @"10", @"D 7-10", @"13-2"]; 
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
NSArray *sortedList = [list sortedArrayUsingComparator:^NSComparisonResult(NSString *string1, NSString *string2) { 
     NSNumber *number1 = [numberFormatter numberFromString:string1]; 
     NSNumber *number2 = [numberFormatter numberFromString:string2]; 

     if (number1 && number2) 
      return [number1 compare:number2]; 
     else if (number1) 
      return NSOrderedAscending; 
     else if (number2) 
      return NSOrderedDescending; 
     else return [string1 compare:string2]; 
}]; 
NSLog(@"sortedList: %@", sortedList); 

출력 :

( 9, 10, "13-2" "19-1" "A를 여기에 당신이 그것을 구현할 수있는 방법입니다 2-5 ", "D 7-10 ")

당신이 integerValue를 사용하는 대신수없는 이유 0은 예를 들어, 13-213으로 파싱하고 21 이전이 될 것입니다. 이는 예상과 다릅니다. NSNumberFormatter는 좀 더 유연하며 문자열이 정확히 숫자가 아니면 nil을 반환합니다.

+0

내가 언급 한 것처럼 정수 값으로 변환하려고했습니다. 감사. – x4h1d

+0

이것은 정렬을 수행하는 가장 어려운 방법입니다. – rmaddy

+0

@rmaddy 당신은 나를 무지하게 느끼게합니다 :) – alexburtnik

0

당신이 직면 한 문제는 에 "숫자와 문자열의 배열"이없고, 배열은 Strings입니다. 문자 순서에 따라 비교됩니다. 첫 번째 문자가 같으면 두 번째 문자를 비교하고, 두 번째 문자를 비교합니다. 결과는 순서대로 나타납니다.

사용자가 지정한 순서를 원할 경우 사용자 지정 비교기/정렬 방법을 구현해야합니다 (this answer은 가능성을 잘 보여줍니다).