排序NSDictionary(包含我的Facebook好友列表)

时间:2011-07-29 22:05:43

标签: iphone sorting facebook-graph-api nsarray nsdictionary

将Graph Facebook API与此代码一起使用

[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”进行排序,但保留对id的引用。

例如,如果我的两个数组是这样的:

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

最后我想要这样的事情:

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

你有什么建议我?谢谢!

4 个答案:

答案 0 :(得分:2)

看起来您不想对NSDictionary进行排序,您希望对NSArray NSDictionaryNSDictionary个对象进行排序,这些对象恰好位于NSArray *unsortedFriends = [dictionaryFromFacebook objectForKey:@"data"]; }。您可以按如下方式简单地提取此好友数组:

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSArray *sortedFriends = [unsortedFriends sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];

现在您可以执行以下操作:

{{1}}

答案 1 :(得分:1)

您可以使用NSArray的sortedArrayUsingComparator:方法执行此操作。比较器块将返回比较其参数名称的结果。

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

答案 2 :(得分:0)

简单的方法是创建一种新的对象:

@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]];

答案 3 :(得分:0)

您可以使用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)
}

如果你需要一个单独的数组,其中包含与键的排序顺序相对应的顺序中的所有值,那么执行上面的迭代并构造该数组。