1

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

我正在提取登录到用户设置应用程序的 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

4 回答 4

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];
    }
    
于 2013-08-06T20:13:32.610 回答
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]];
}
于 2013-08-06T20:08:20.177 回答
0

让我们将您的数组命名为 firstArray 和 secondArray。

NSArray *sortedArray = [secondArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [@([firstArray indexOfObject:[obj1 objectForKey:@"name"]]) compare:@([firstArray indexOfObject:[obj2 objectForKey:@"name"]])];
    }];
于 2013-08-06T20:12:26.807 回答
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.
  }
}];
于 2013-08-06T19:59:29.870 回答