将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"};
你有什么建议我?谢谢!
答案 0 :(得分:2)
看起来您不想对NSDictionary
进行排序,您希望对NSArray
NSDictionary
个NSDictionary
个对象进行排序,这些对象恰好位于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)
}
如果你需要一个单独的数组,其中包含与键的排序顺序相对应的顺序中的所有值,那么执行上面的迭代并构造该数组。