我正在抓取两个JSON
并将其单独存储为NSArray
和NSDictionary
。
这就是JSON
数据结构的样子
(
{
Cells = (
{
ValueName = "name";
Text = "John Appleseed";
},
{
"Option": {
"Text": "19"
},
ValueName = "age"
}, etc...
)
},
{
Cells = (
{
ValueName = "name";
Text = "John Appleseed";
},
{
ValueName = "age",
"Option": {
"Text": "19"
}
}, etc...
)
}
)
{
"map": {
"first": "name",
"second": "age"
}, etc...
}
这两个值需要交叉引用(一个包含所有数据(allData
),另一个包含需要哪些数据的“map”(mapData
)。 / p>
如何将allData
的所有值与mapData
的所有值进行比较,如果可能的话,还要记住简单性和记忆力?
一个很好的方法是使用containsObject
匹配[allData allValues]
与[mapData allValues]
匹配并返回NSArray
与object
匹配。唉,事实并非如此。这种方法完美地说明了我希望实现的目标。
我最初的方法是缓慢,内存占用和丑陋(从记忆中写下来):
NSArray *allData = [NSJSONSerialization JSONObjectWithData:allDataJSON options:kNilOptions error:&JSONSerializationError];
NSDictionary *mapData = [NSJSONSerialization JSONObjectWithData:mapDataJSON options:kNilOptions error:&JSONSerializationError];
NSMutableDictionary *resultData = [[NSMutableDictionary alloc] init];
for (int count = 0; count<allData.count; count++) {
id dataValue = [allData objectAtIndex:count];
for (id key in mapData) {
if ([[mapData objectForKey:key] containsObject:dataValue]) {
[resultData setObject:[dataValue objectForKey:@"value"] forKey:key]
}
}
}
能够引用匹配值的每个匹配(在我的方法中已完成)也很重要。
这不是基于意见的问题,因为优化和内存使用不是意见。
答案 0 :(得分:0)
我发现使用这种数据模型的内存效率非常快(在allData
长度为1000行的情况下,平均时间为0.001秒)。
通过从mapData
中提取所有想要的值并将它们放在NSArray
中,可以轻松地将值与allData
的值匹配。
通过mapDataArray
循环时,可以创建一个辅助循环以获取allData
的值。如果mapDataArray containsObject
返回true,则数据可以存储在瞬时存储字典中。
这样可以轻松管理所需的数据和可忽略的数据。重要的是,瞬间存储是在第一个循环内部创建的(正如您稍后会看到的那样)。
如果找到mapDataArray
中的所有值(通过mapDataArray.count
检查momentaryData.count
),我们可以break
当前循环(从而节省时间和内存)
查看代码以了解实际情况可能更容易。
问题中引用的数据对象。
NSArray *allData = [NSJSONSerialization JSONObjectWithData:allDataJSON options:kNilOptions error:&JSONSerializationError];
NSDictionary *mapData = [NSJSONSerialization JSONObjectWithData:mapDataJSON options:kNilOptions error:&JSONSerializationError];
创建mapDataArray
,循环播放,创建瞬时字典,附加找到的对象并将瞬时数据附加到resultData
。
NSArray *mapDataArray = [[NSArray alloc] init];
mapDataArray = [[mapDataArray arrayByAddingObjectsFromArray:[[mapData objectForKey:@"map"] objectForKey:@"first"]] arrayByAddingObjectsFromArray:[[mapData objectForKey:@"map"] objectForKey:@"second"]];
mapDataArray = [[NSOrderedSet orderedSetWithArray:mapDataArray] array]; //Remove duplicates
NSMutableDictionary *resultData = [[NSMutableDictionary alloc] init];
for (int count = 0; count<allData.count; count++) {
NSMutableDictionary *momentaryData = [[NSMutableDictionary alloc] init];
int dataNumber = count;
NSArray *literal = [[allData objectAtIndex:dataNumber] objectForKey:@"Cells"];
for (int count = 0; count<literal.count; count++) {
id literal = [[[allData objectAtIndex:dataNumber] objectForKey:@"Cells"] objectAtIndex:count];
if ([mapDataArray containsObject:[literal objectForKey:@"ValueName"]]) {
id value = [literal objectForKey:@"Text"];
if (!value) {
value = [literal objectForKey:@"Option"];
if (value && ![value isEqual:[NSNull null]]) {
value = [value objectForKey:@"Text"];
} else {
value = @"";
}
}
[momentaryData setObject:[NSString stringWithFormat:@"%@", value] forKey:[literal objectForKey:@"ValueName"]];
if (mapDataArray.count == momentaryData.count) {
break; //We have what we came for...
}
}
}
[resultData setObject:momentaryData forKey:[NSString stringWithFormat:@"%d", dataNumber]];
}
答案 1 :(得分:0)
您可以使用arrays
比较dictionaries
或isEqual:
。
对于arrays
,它会比较arrays
是否具有相同数量的元素,或者匹配元素是否相等。
对于dictionaries
,它检查两者是否具有相同数量的密钥,如果密钥组相等以及一个dictionary
中的每个密钥与另一个dictionary
中的匹配密钥具有相同的值<html>
<head>
<style type="text/css">
.withBorder
{
border:1px solid #000000;
}
</style>
</head>
<body>
<table class="withBorder">
<tr>
<td class="withBorder">First line</td>
<td class="withBorder">with a second field</td>
</tr>
<tr>
<td class="withBorder" style="border-bottom:none;">this is a</td>
<td class="withBorder" rowspan="2" >with also a second field</td>
</tr>
<tr>
<td class="withBorder" style="border-top:none;">multiline test</td>
<tr>
<td class="withBorder">Last line</td>
<td class="withBorder"></td>
</tr>
</table>
</body>
</html>
1}}。