NSDictionary查找键值的索引

时间:2014-10-22 08:30:28

标签: ios objective-c uitableview nsdictionary

所以我有两个字典结构:

{
 version: "1.0",
 timestamp: 1123,
 data: [
  {
   foo: "0.0026",
   bar: 548,
  },
  {
   foo: "0.0065",
   bar: 341,
  },
 ],
revision: 1234
}

就这样

{
 version: "1.0",
 timestamp: 1123,
 data: [
  {
   foo74: "0.0026",
   bar: 340,
  },
  {
   foo74: "0.0378",
   bar: 548,
  },
 ],
revision: 2345
}

这些是从两个单独的API调用异步加载的,然后重新加载UITableView。 在每个UITableViewCell中,我需要匹配bar值以显示每个单元格中的相关数据。例如:UITableView的索引0将包含bar: 548和foo:"0.0026"但是,在同一个单元格中,我需要包含foo74的值,在这种情况下是"0.0378"。这意味着我必须浏览第二个数据集并找到bar等于548的索引。

我试图找到一种在cellForRowAtIndexPath内部执行此操作的方法,而不必迭代第一个中的每一个的第二个数据条目(导致O(n ^ 2)运行时)。

我通过将allKeysForObject的值传递到第二个数据集来尝试548,但它似乎没有返回任何内容。

我考虑过事先对它们进行排序,这会让我的运行时间略好一些。

我真的只是在寻找一些可以避免我不得不这样做的事情:

for (int i = 0; i < [[dict2 objectForKey:@"data"] count]; i++) {
        if(dict1[@"data"][indexPath.row][@"bar"] == dict2[@"data"][i][@"bar"])
        {
            NSLog(@"found");
        }
    }

3 个答案:

答案 0 :(得分:0)

在重新加载表视图之前,您应该将dict2中的数据索引到NSDictionary中,键值为&#34; bar&#34;和value是你想要获得的数据(在这种情况下是&#34; foo74&#34;的值)。

cellForRowAtIndexPath方法内,请致电indexDict[dict1[@"data"][indexPath.row][@"bar"]]查找数据。如果此值为nil,则表示未找到。

索引循环需要O(n)运行时,每次调用查找数据都需要O(1)运行时。

答案 1 :(得分:0)

您可以按照以下方式处理另一个选项:
您需要将dataDict2数据数组转换为字典 喜欢

for (int i = 0;i < [dataArray2 count]; i++) {

               [newDataDict addEntriesFromDictionary: @{[[dataArray2 objectAtIndex:i]objectForKey:@"bar"] : [[dataArray2 objectAtIndex:i]objectForKey:@"foo74"]}];

    }

    [newDataDict objectForKey:@"548"]; // which will be 0.0378

答案 2 :(得分:0)

您可以将所有密钥设为[Dic AllKeys],将所有值设为[Dic AllValues]。然后,您可以预先处理[Dic valueForkey:[[Dic AllKeys] objectAtIndex:0]]之类的所有密钥。通过这种方式,您可以获取第一个字典键并将其与第二个字典连接。