所以我有两个字典结构:
{
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");
}
}
答案 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]]
之类的所有密钥。通过这种方式,您可以获取第一个字典键并将其与第二个字典连接。