iOS根据另一个数组中的字符串顺序对一个数组进行排序

时间:2013-08-06 19:53:16

标签: ios sorting nsarray

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

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

然后我将此数组传递给此Twitter API:

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

返回的数组包含我登录的每个用户帐户所需的所有其他数据。第一个数组包含NSStrings(用户名),返回的数组已被解析为包含具有键和用户名,名称值的字典的字典,和个人资料照片

现在问题是订单与我传递的第一个数组完全不同。这是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返回数据的方式,它永远不会是完全相同的顺序,因此每次调用这些方法时都必须检查它。

任何帮助都会很棒,会挽救我的夜晚。提前谢谢!

4 个答案:

答案 0 :(得分: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];
    }
    

答案 1 :(得分: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]];
}

答案 2 :(得分:0)

那种排序顺序不是易于复制的东西(即它不是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.
  }
}];

答案 3 :(得分:0)

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

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