Сортировка NSDictionary (который содержит мой список друзей в Facebook) - PullRequest
0 голосов
/ 30 июля 2011

Использование API Facebook Graph с этим кодом

[facebook requestWithGraphPath:@"me/friends" andDelegate:self]; 

Теперь у меня есть NSDictionary, подобный следующему:

{data =     (
            {
        id = 123456;
        name = "Mark Zuckerberg";
    },
            {
        id = 654321;
        name = "Steve Jobs";
    },
            {
        id = 13579;
        name = "Bill Gates";
    }
    ...
  );
}

Я хочу отсортировать этот NSDictionary, но я знаю, чтоэто невозможно.Конечно, я могу создать 2 NSArray (или NSMutableArray), один «array_id» и другой «array_name».Я хотел бы отсортировать «имя_массива», но сохраняя ссылку на идентификатор.

Например, если мои два массива выглядят примерно так:

array_name = {"Mark", "Steve", "Bill};
array_id   = {"123456", "654321", "13579"};

Я хочу, наконец, как то так:

array_name = {"Bill", "Mark", "Steve"};
array_id   = {"13579", "123456", "654321"};

Что вы мне предлагаете?Спасибо!

Ответы [ 4 ]

2 голосов
/ 30 июля 2011

Не похоже, что вы хотите отсортировать NSDictionary, вы хотите отсортировать NSArray из NSDictionary объектов, которые, как это и происходит с самим собой, находятся в NSDictionary. Вы можете просто извлечь этот массив друзей следующим образом:

NSArray *unsortedFriends = [dictionaryFromFacebook objectForKey:@"data"];

Теперь вы можете делать следующее:

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sortedFriends = [unsortedFriends sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
1 голос
/ 30 июля 2011

Вы можете сделать это, используя sortedArrayUsingComparator: метод NSArray.Блок компаратора возвращает результат сравнения имен своих аргументов.

NSDictionary *requestResult = ...; // get your original dictionary
NSArray *unsortedArray = [requestResult objectForKey:@"data"];
NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^(id obj1, id obj2) {
    NSString *name1 = (NSString *)[(NSDictionary *)obj1 objectForKey:@"name"];
    NSString *name2 = (NSString *)[(NSDictionary *)obj2 objectForKey:@"name"];
    return [name1 caseInsensitiveCompare:name2];
}];
0 голосов
/ 30 июля 2011

Вы можете использовать любой из 3 методов -keysSortedByValueUsingSelector:, -keysSortedByValueUsingComparator: или -keysSortedByValueWithOptions:usingComparator:, чтобы получить массив ключей, отсортированных в порядок. Итак, если вы хотите выполнить итерацию по порядку, вы можете сделать что-то вроде этого:

NSDictionary *myDict = ...;
for (id key in [myDict keysSortedByValueUsingSelector:@selector(compare:)])
{
    id value = [myDict objectForKey:key];
    // Do stuff with (key, value)
}

Если вам нужен отдельный массив, содержащий все значения в порядке, соответствующем отсортированному порядку ключей, то выполните вышеуказанную итерацию и создайте этот массив.

0 голосов
/ 30 июля 2011

Простым было бы создание объекта нового типа:

@interface Friend : NSObject

@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *facebookID;

@end

@implementation Friend

@synthesize name, facebookID;

- (void)dealloc {
  [name release];
  [facebookID release];
  [super dealloc];
}

@end

Когда у вас есть это, вы можете перебрать свой массив, который вы вернули, и сделать:

NSMutableArray *friends = [NSMutableArray array];
for (NSDictionary *rawFriend in arrayOfFriends) {
  NSString *name = [rawFriend objectForKey:@"name"];
  NSString *fID = [rawFriend objectForKey:@"id"];

  if (name && fID) {
    Friend *f = [[Friend alloc] init];
    [f setName:name];
    [f setFacebookID:fID];
    [friends addObject:f];
    [f release];
  }
}

Как только вы это сделаете, все будет просто отсортировать:

NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
[friends sortUsingDescriptors:[NSArray arrayWithObject:sortByName]];
...