【问题标题】:Sort array with dictionaries by date按日期对带有字典的数组进行排序
【发布时间】:2015-06-01 10:48:25
【问题描述】:

我有一个NSArray,里面有NSDictionary。它看起来像:

等等

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

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

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

【问题讨论】:

    标签: ios objective-c arrays sorting


    【解决方案1】:

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

    NSArray * sortedArray = [myArray sortedArrayUsingComparator:^(id obj1, id obj2) {
                NSNumber *rating1 = [(NSDictionary *)obj1 objectForKey:@"date"];
                NSNumber *rating2 = [(NSDictionary *)obj2 objectForKey:@"date"];
                return [rating1 compare:rating2];
            }];
    

    【讨论】:

      【解决方案2】:

      您可以使用sortArrayUsingComparator:轻松对其进行排序

      [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
          return //pseudo-code: {obj1->dict->date isLaterThan obj2->dict->date};
      }];
      

      【讨论】:

        【解决方案3】:

        我排序。不确定我的代码是否清晰且优化良好。但这里有一个解决方案:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-26
          • 2017-04-19
          • 2019-12-07
          • 2021-08-20
          • 1970-01-01
          • 2014-06-10
          相关资源
          最近更新 更多