2011-01-22 3 views
4

У меня есть PLIST, как это:Как отсортировать NSArray, который содержит NSDictionary?

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

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, как можно сортировать его сейчас? –