按日期对带有字典的数组进行排序

时间:2015-06-01 10:48:26

标签: ios objective-c arrays sorting

我的NSArray里面有NSDictionary。它看起来像:

original array

我需要在NSDictionary内按日期对其进行排序。我需要这样的东西:

final array

我该怎么做?这是我的方法,它给了我第一个未排序的数组:

- (void)iterateOverDocumentsDirectory
{
    arrayWithFiles = [NSMutableArray new];

    NSFileManager *fileManager = [[NSFileManager alloc] init];
    NSError *error;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirPath = [paths objectAtIndex:0];

    NSString *finalPathToFolder = [NSString stringWithFormat:@"%@/", documentsDirPath];

    albumNames = [[fileManager contentsOfDirectoryAtPath:finalPathToFolder error:&error] mutableCopy];
    if (albumNames == nil) {
        // error...
    }

    for (NSString *album in albumNames)
    {
        NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
        [tempDict setValue:album forKey:@"name"];

        NSString *finalPathToFiles = [NSString stringWithFormat:@"%@/%@", documentsDirPath, album];

        NSArray *tempArray = [fileManager contentsOfDirectoryAtPath:finalPathToFiles error:&error];

        NSMutableArray *arrayWithEachFiles = [NSMutableArray new];
        for (NSString *tempString in tempArray)
        {
            NSMutableDictionary *eachFileDict = [[NSMutableDictionary alloc] init];
            NSString *pathToFile = [NSString stringWithFormat:@"%@/%@/%@", documentsDirPath, album, tempString];

            [eachFileDict setValue:pathToFile forKey:@"path"];

            NSDictionary *filePathsArray1 = [[NSFileManager defaultManager] attributesOfItemAtPath:pathToFile error:nil];
            NSDate *modifiedDate = [filePathsArray1 objectForKey:NSFileCreationDate];

            [eachFileDict setValue:modifiedDate forKey:@"date"];

            [arrayWithEachFiles addObject:eachFileDict];
        }

        NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
        NSArray *sortDescriptors = @[ageDescriptor];
        NSArray *sortedArrayWithFiles = [[arrayWithEachFiles sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];

        [tempDict setValue:sortedArrayWithFiles forKey:@"files"];

        [arrayWithFiles addObject:tempDict];
    }
}

3 个答案:

答案 0 :(得分:2)

使用以下代码对字典数组进行排序:

setApplicationId:clientKey

答案 1 :(得分:1)

您可以使用sortArrayUsingComparator:

轻松对其进行排序
[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return //pseudo-code: {obj1->dict->date isLaterThan obj2->dict->date};
}];

答案 2 :(得分:0)

我对它进行排序。不确定我的代码是否清晰且优化得很好。但这是一个解决方案:

    NSMutableArray *masterArray = [NSMutableArray new];
    NSMutableArray *sameDates = [NSMutableArray new];

    BOOL started = NO;
    NSString *prevDate;

    for (NSDictionary *dict in sortedArrayWithFiles)
    {
        NSString *tempString = [dict objectForKey:@"date"];

        if (started)
        {
            if ([tempString isEqualToString:prevDate])
            {
                [sameDates addObject:dict];
            }
            else
            {
                NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
                [tempDict setValue:tempString forKey:tempString];
                [tempDict setValue:sameDates forKey:@"files"];
                [masterArray addObject:tempDict];
                prevDate = tempString;
                [sameDates removeAllObjects];
                [sameDates addObject:tempString];
            }
        }
        else
        {
            // first element
            started = YES;
            prevDate = tempString;
            [sameDates addObject:dict];
        }

    }

    // last value
    NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
    [tempDict setValue:prevDate forKey:prevDate];
    [tempDict setValue:sameDates forKey:@"files"];
    [masterArray addObject:tempDict];

在主数组中,我们存储的数组包含按日期分隔的字典。