iOS比较NSDictionary值

时间:2015-09-30 10:00:43

标签: ios objective-c json compare nsarray

我正在抓取两个JSON并将其单独存储为NSArrayNSDictionary

这就是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]匹配并返回NSArrayobject匹配。唉,事实并非如此。这种方法完美地说明了我希望实现的目标。

我最初的方法是缓慢,内存占用和丑陋(从记忆中写下来):

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]
        }
    }
}

能够引用匹配值的每个匹配(在我的方法中已完成)也很重要。

这不是基于意见的问题,因为优化和内存使用不是意见。

2 个答案:

答案 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比较dictionariesisEqual:

对于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}}。