2013-08-06 106 views
1

这是我试图解决另一个非常具体的问题,基于字符串的顺序。的iOS排序一个阵列中的另一个阵列

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

我然后这个数组传递给该微博API:

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

返回的数组包含所有的附加数据我需要登录的每个用户帐户的第一阵列包含NSString的(用户名),返回的数组已被解析为包含具有用户名,名称和配置文件图片的键和值的字典。

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

如何判断新数组是否与包含的字典匹配的顺序与基于用户名密钥的第一个数组的顺序相同?

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

这里是第一阵列输出:

(
    kbegeman, 
    indeedyes, 
    soiownabusiness, 
    iphonedev4me 
) 

这里是第二阵列输出:

(
     { 
     image = "https://si0.twimg.com/profile_images/3518542448/3d2862eee546894a6b0600713a8de862_normal.jpeg"; 
     name = "Kyle Begeman"; 
     "screen_name" = kbegeman; 
    }, 
     { 
     image = "https://si0.twimg.com/profile_images/481537542/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 = "https://si0.twimg.com/sticky/default_profile_images/default_profile_5_normal.png"; 
     name = "Brad Pitt"; 
     "screen_name" = soiownabusiness; 
    } 
) 

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

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

+1

哎呀,我不敢相信以前没有人问过这个问题。 –

回答

6

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

我会用映射词典:

  1. 创建字典从网名用户词典

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

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

这不正是我所建议的吗? –

+1

是的,我很抱歉,但我正在输入我的答案。 – Tricertops

+0

@MartinR有人低估了我们俩... – Tricertops

0

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

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

首先产生的“SCREEN_NAME”为相应的字典 映射所述第二阵列中的映射:

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

然后就可以用一个单回路创建排序后的数组:

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

@Downvoter:有何评论? –

0

允许将数组命名为firstArray和secondArray。

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

请注意,这需要对每个比较进行两次'indexOfObject:'查找,因此对于较大的数组可能会严重缩放。 –