我的应用程序中有一个NSDictionaries NSArray。在每本词典中,我都拥有一个称为“ RunDate”的NSDate。我现在遇到的问题是我尝试使用的代码效率很低。基本上,我只希望每个日期中所有词典中只有一个部分。然后在每个部分(按该日期排序)中,我将加载具有该日期的适当字典。

在下面的代码中,我制作了一个新的NSDictionarys NSArray,其中包含日期和该日期的编号(因此我可以知道每个节中有多少行)。问题是,这段代码看起来和感觉都很低效,我想知道我的代码是否有任何不正确的方法或可以改进的方法。可能有500多个条目,而我现在拥有的代码非常慢。有人对此有任何建议吗?

    runArray = [[NSMutableArray alloc] init];
    runArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"RunArray"] mutableCopy];

    runDictTableArray = [[NSMutableArray alloc] init];
    for (NSDictionary *dict in runArray) {
        NSDictionary *runInfoDict = [[NSMutableDictionary alloc] init];
        NSDate *theDate = [dict objectForKey:@"RunDate"];

        //Check if we already have this date in the saved run array
        BOOL goToNextDict = FALSE;
        for (NSDictionary *savedDict in runDictTableArray) {
            if ([theDate compare:[savedDict objectForKey:@"RunDate"]] == NSOrderedSame) {
                goToNextDict = TRUE;
                break;
            }
        }
        if (goToNextDict)
            continue;
        ////////////////////////////

        //Now we check how many more we have of this date
        int numbOfDate = 1;
        int index = (int)[runArray indexOfObject:dict];
        for (int i = index; i < [runArray count]; i++) {
            NSDictionary *dictInner = [runArray objectAtIndex:i];
            if ([theDate compare:[dictInner objectForKey:@"RunDate"]] == NSOrderedSame) {
                numbOfDate++;
            }
        }
        ////////////////////////////

        [runInfoDict setValue:[NSNumber numberWithInt:numbOfDate] forKey:@"DateAmount"];
        [runInfoDict setValue:theDate forKey:@"Date"];
        [runDictTableArray addObject:runInfoDict];
    }

最佳答案

一些建议:


您可能只需要1个NSMutableDictionary,而不是NSMutableArrayNSDictionary。在遍历runArray时,检查您的词典中是否有您的日期值(objectForKey返回一个值)。如果是这样,则将计数加1。如果不是,则将该日期作为键添加到值为1的字典中。这样,您就不必进行内部循环来获取日期发生的次数。我想,您也不需要“转到下一个字典”逻辑。
runArray = [[NSMutableArray alloc] init];并没有真正做任何事情,因为您将立即重新分配runArray
考虑在常规NSInteger上使用intNSInteger将为您的应用程序所运行的任何体系结构提供适当的大小。
您可能会喜欢一些很酷的语法快捷方式。您可以通过简单地编写[runInfoDict setValue:[NSNumber numberWithInt:numbOfDate]...来避免[runInfoDict setValue:@(numbOfDate) ...,这将为您将值放入NSNumber

09-25 21:46