2010-01-03 2 views
0

그래서 키가 연도는 NSString으로 NSDictionary이고 각 키의 값은 해당 연도에 대한 설명 일종의 NSString입니다. 예를 들어, 하나의 열쇠는 "943 B.C."이고, 또 다른 열쇠는 1886입니다. 내가 겪고있는 문제는 자연스럽게 오름차순으로 정렬하고 싶다는 것입니다.숫자의 NSString 정렬

이 년의 데이터 소스가 이미 주문되어있는 것입니다. 바로 제가 전화를 걸어 setValue:forKey으로 전화하면 주문이 자연히 손실됩니다. 나는이 두 가지를 정렬하는 방법을 생각해내는 것이 고통 스러울지도 모르는 대신에 삽입 단계에서 순서를 유지하는 방법을 찾아야한다고 생각한다. 어떻게해야합니까? 대신 나는 모든 객체가 실제로 NSDictionary 인 키를 해와 값으로 묘사하는 NSMutableArray을 만들어야합니까?

방금 ​​내 자신의 질문에 답변을했지만이 시간을 낭비하지 않으려면 누구나이 작업을 더 잘 수행 할 수 있도록 권장합니다.

감사합니다.

EDIT : NSMutableArray에 대해 NSDictionary 항목으로 키/값 쌍을 보유하고 있습니다. 이것은 내가 잘하면 내가이 제대로하고있어, 나중에 정보에 액세스하고 방법입니다

// parsedData is the NSMutableArray which holdes the NSDictionary entries 
for (id entry in parsedData) { 
    NSString *year = [[entry allKeys] objectAtIndex:0]; 
    NSString *text = [entry objectForKey:year]; 

    NSLog(@"Year: %@, Text: %@", year, text); 
} 

답변

1

사전의 배열, 제안대로 또는 문자열이 원래 사전의 키인 문자열 배열로 사용할 수 있습니다. 후자는 아마 그것에 대해가는 더 간단한 방법 일 것입니다. NSDictionary는 이해할 수있는 것처럼 키의 특정 순서를 유지하지 않으므로 값을 정렬하려고 시도하는 것이 현명하지 않을 수 있습니다.

2

모든 키 - 값 쌍을 보유하고있는 NSDictionary뿐만 아니라, 순서대로 키를 저장하는 NSMutableArray을 유지한다.

Here과 비슷한 질문입니다.

0

"Ubuntu 10.04 (lucid)"와 같이 운영 체제 이름 문자열을 정렬하는 비슷한 문제를 해결해야했습니다.

필자의 경우 문자열에 임의의 값이있을 수 있으므로 토큰으로 정렬하고 토큰이 숫자인지 테스트합니다. 또한 숫자로 간주되는 "8.04.2"와 같은 문자열을 고려하므로 중첩 된 토큰 화 수준이 있습니다. 다행히 중첩 루프는 일반적으로 하나의 반복입니다.

이것은 곧 출시 될 OpenStack iPhone 앱의 내용입니다.

- (NSComparisonResult)compare:(ComputeModel *)aComputeModel { 
     NSComparisonResult result = NSOrderedSame; 
     NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
     NSArray *tokensA = [self.name componentsSeparatedByString:@" "]; 
     NSArray *tokensB = [aComputeModel.name componentsSeparatedByString:@" "]; 

     for (int i = 0; (i < [tokensA count] || i < [tokensB count]) && result == NSOrderedSame; i++) { 
      NSString *tokenA = [tokensA objectAtIndex:i]; 
      NSString *tokenB = [tokensB objectAtIndex:i]; 

      // problem: 8.04.2 is not a number, so we need to tokenize again on . 

      NSArray *versionTokensA = [tokenA componentsSeparatedByString:@"."]; 
      NSArray *versionTokensB = [tokenB componentsSeparatedByString:@"."]; 

      for (int j = 0; (j < [versionTokensA count] || j < [versionTokensB count]) && result == NSOrderedSame; j++) { 
       NSString *versionTokenA = [versionTokensA objectAtIndex:j]; 
       NSString *versionTokenB = [versionTokensB objectAtIndex:j]; 
       NSNumber *numberA = [formatter numberFromString:versionTokenA]; 
       NSNumber *numberB = [formatter numberFromString:versionTokenB]; 

       if (numberA && numberB) { 
        result = [numberA compare:numberB]; 
       } else { 
        result = [versionTokenA compare:versionTokenB]; 
       } 
      } 
     } 
     [formatter release]; 
     return result; 
    }