2010-01-03 103 views
0

所以我有一個NSDictionary,其中關鍵字的年份爲NSString's,每個關鍵字的值也是NSString,這是一種年份的描述。例如,一個關鍵是「943 B.C.」,另一個是「1886」。我遇到的問題是,我想按自己的升序排序。Sorting NSString of Numbers

事情是這些年的數據源已經是有序的,只是當我繼續打電話setValue:forKey命令丟失,自然。我想象一下找出一種方法來排序這些NSString的可能是一種痛苦,而我應該尋找一種在插入階段保持順序的方法。我該怎麼辦?我應該改爲NSMutableArray,其中每個對象實際上是一個NSDictionary,它由鍵爲年份,值爲描述?

我想我只是回答了我自己的問題,但爲了避免浪費這一次,我會留下來以防萬一任何人都可以推薦更好的方法來做到這一點。

謝謝!

編輯:我繼續以我自己的想法NSMutableArrayNSDictionary條目來保存鍵/值對。這是怎麼了訪問信息以後,希望我這個做正確:

// 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

保持一個NSMutableArray的鑰匙存放有序,除了它包含所有鍵值對的NSDictionary

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; 
    }