iOS 比较 NSDictionary 值
iOS comparing NSDictionary values
我正在获取两个 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
)是什么数据需要)。
我如何将 allData
的所有值与 mapData
的所有值进行比较,同时尽可能记住简单性和记忆性?
一个很好的方法是使用 containsObject
将 [allData allValues]
与 [mapData allValues]
匹配,并返回 NSArray
与匹配的 object
。 las,事实并非如此。该方法完美地说明了我希望实现的目标。
我最初的方法很慢,占用内存而且丑陋(凭记忆写的):
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.001 秒,allData
的长度为 1000 行)。
通过从 mapData
中提取所有想要的值并将它们放在 NSArray
中,这些值可以很容易地与 allData
.
的值相匹配
当循环遍历 mapDataArray
时,可以创建一个辅助循环来遍历 allData
的值。如果mapDataArray containsObject
returns 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]];
}
您可以使用 isEqual:
比较 arrays
或 dictionaries
。
对于arrays
比较arrays
的元素个数是否相同或者匹配的元素是否相等
对于 dictionaries
它检查两者是否具有相同数量的键,一组键是否相等以及一个 dictionary
中的每个键是否与另一个中的匹配键具有相同的值dictionary
.
我正在获取两个 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
)是什么数据需要)。
我如何将 allData
的所有值与 mapData
的所有值进行比较,同时尽可能记住简单性和记忆性?
一个很好的方法是使用 containsObject
将 [allData allValues]
与 [mapData allValues]
匹配,并返回 NSArray
与匹配的 object
。 las,事实并非如此。该方法完美地说明了我希望实现的目标。
我最初的方法很慢,占用内存而且丑陋(凭记忆写的):
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.001 秒,allData
的长度为 1000 行)。
通过从 mapData
中提取所有想要的值并将它们放在 NSArray
中,这些值可以很容易地与 allData
.
当循环遍历 mapDataArray
时,可以创建一个辅助循环来遍历 allData
的值。如果mapDataArray containsObject
returns 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]];
}
您可以使用 isEqual:
比较 arrays
或 dictionaries
。
对于arrays
比较arrays
的元素个数是否相同或者匹配的元素是否相等
对于 dictionaries
它检查两者是否具有相同数量的键,一组键是否相等以及一个 dictionary
中的每个键是否与另一个中的匹配键具有相同的值dictionary
.