2011-01-22 80 views
4

我有一個plist中是這樣的:如何排序包含NSDictionary的NSArray?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>highscores</key> 
<array> 
    <dict> 
    <key>highscoreInSeconds</key> 
    <string>9</string> 
    <key>levelName</key> 
    <string>1</string> 
    <key>name</key> 
    <string>Black</string> 
    </dict> 
    <dict> 
    <key>highscoreInSeconds</key> 
    <string>12</string> 
    <key>levelName</key> 
    <string>1</string> 
    <key>name</key> 
    <string>Black</string> 
    </dict> 
</array> 
</dict> 
</plist> 

現在我想通過highscoreInSeconds排序此。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *plistDirectory = [paths objectAtIndex:0]; 
NSString* fullPath = [plistDirectory stringByAppendingPathComponent:@"data.plist"]; 

NSMutableDictionary* pData = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath]; 
NSMutableArray* highscores = [pData valueForKey:@"highscores"]; 

現在該如何排序呢?

非常感謝! :)

有一個愉快的一天。

PS:應該是這樣的結尾:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>highscores</key> 
<array> 
    <dict> 
    <key>highscoreInSeconds</key> 
    <string>12</string> 
    <key>levelName</key> 
    <string>1</string> 
    <key>name</key> 
    <string>Black</string> 
    </dict> 
    <dict> 
    <key>highscoreInSeconds</key> 
    <string>9</string> 
    <key>levelName</key> 
    <string>1</string> 
    <key>name</key> 
    <string>Black</string> 
    </dict> 
</array> 
</dict> 
</plist> 

你不需要說我怎麼寫的plist我知道這一點。

回答

7

我用這個:

NSArray* sorted = [highscoreAll sortedArrayUsingComparator:(NSComparator)^(NSDictionary *item1, NSDictionary *item2) { 
      NSString *score1 = [item1 objectForKey:@"highscoreInSeconds"]; 
      NSString *score2 = [item2 objectForKey:@"highscoreInSeconds"]; 
      return [score1 compare:score2 options:NSNumericSearch]; 
      }]; 

和它的工作。

4

您可以使用

- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context 

實現其說一個函數,它在排序值越大2字典。

NSInteger intSort(id value1, id value2, void *context) 
{ 
    id v1 = [value1 valueforkey:@""];//give required key 
    id v2 = [value2 valueforkey:@""];//give required key 
    if (v1 < v2) // do comparison based on the data type 
     return NSOrderedAscending; 
    else if (v1 > v2) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
} 
+0

但我會投你的答案,因爲我認爲這將工作太 – cocos2dbeginner 2011-01-22 10:23:15

4
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *plistDirectory = [paths objectAtIndex:0]; 
NSString* fullPath = [plistDirectory stringByAppendingPathComponent:@"data.plist"]; 

NSMutableDictionary* pData = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath]; 
NSMutableArray* highscores = [pData valueForKey:@"highscores"]; 

現在使用...... 您可以通過用戶NSSortDescriptor此&非常容易使用。 只是通過提供要排序的數組的關鍵..

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"highscores" ascending:YES]; 
[highscores sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]; 
[descriptor release]; 

希望能對你來說,

0
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest"  ascending:YES]; 
[stories sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]; 
recent = [stories copy]; 
+0

鍵值是int,那麼現在該如何排序呢? – 2017-11-01 11:46:52