根据日期排序数组

时间:2010-11-30 12:39:14

标签: iphone core-data

根据日期排序数组, 问题是以字符串格式保存的日期可以在NSDate对象中对数组进行排序而无需更改日期。(核心数据)。

字符串格式为mm / dd / yyyy

7 个答案:

答案 0 :(得分:1)

您可以使用sortDescriptorWithKey:ascending:comparator:创建排序,并提供一个可以比较任意两个日期字符串的块。适用于iOS 4.0及更高版本。

答案 1 :(得分:1)

这里的方法是使用NSArray方法-sortedArrayUsingFunction:context:。这适用于iOS 2.0及更高版本,非常简单。你会打电话:

sortedArray = [unsortedArray sortedArrayUsingFunction:sortByStringDate context:NULL];

你需要像这样定义函数:

NSInteger sortByDateString(id string1, id string2, void *context)
{
    int y1 = [[string1 yearComponent] intValue];
    int y2 = [[string2 yearComponent] intValue];
    if (y1 < y2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        int m1 = [[string1 monthComponent] intValue];
        int m2 = [[string2 monthComponent] intValue];
        if (m1 < m2)
             return NSOrderedAscending;
    // et cetera
}

您需要自己的逻辑来分离字符串的年,月和日期,以便您可以比较每个字符串。我不确定这是否比Dennis建议的将字符串转换为日期更少,但你知道你的程序也是如此。

答案 2 :(得分:1)

    -(NSMutableArray *)sortByStringDate:(NSMutableArray *)unsortedArray
{
    NSMutableArray *tempArray=[NSMutableArray array];
    for(int i=0;i<[unsortedArray count];i++)
    {

        NSDateFormatter *df=[[NSDateFormatter alloc]init];
      objModel=[unsortedArray objectAtIndex:i];

        [df setDateFormat:@"MM/dd/yyyy"];
        NSDate *date=[df dateFromString:objModel.sDate];
        NSMutableDictionary *dict=[NSMutableDictionary dictionary];
        [dict setObject:objModel forKey:@"entity"];
        [dict setObject:date forKey:@"date"];
        [tempArray addObject:dict];
    }

    NSInteger counter=[tempArray count];
    NSDate *compareDate;
    NSInteger index;
    for(int i=0;i<counter;i++)
    {
        index=i;
        compareDate=[[tempArray objectAtIndex:i] valueForKey:@"date"];
        NSDate *compareDateSecond;
        for(int j=i+1;j<counter;j++)
        {
            compareDateSecond=[[tempArray objectAtIndex:j] valueForKey:@"date"];
            NSComparisonResult result = [compareDate compare:compareDateSecond];
           if(result == NSOrderedAscending)
           {
               compareDate=compareDateSecond;
               index=j;
           }
        }
        if(i!=index)
          [tempArray exchangeObjectAtIndex:i withObjectAtIndex:index];
    }


    [unsortedArray removeAllObjects];
    for(int i=0;i<[tempArray count];i++)
    {
        [unshortedArray addObject:[[tempArray objectAtIndex:i] valueForKey:@"entity"]];
    }
    return unsortedArray;

}

这适合我。

答案 3 :(得分:0)

如果日期以字母排序等同于日期排序的格式存储,则无法使用核心数据。在这种情况下,您有两个选择:

  1. 向数据库添加新的NSDate属性,并将每个文本日期转换为实际日期并更新记录。然后,您可以使用核心数据进行排序
  2. 将所有数据提取到内存数组中,然后使用自定义比较方法对其进行排序。

答案 4 :(得分:0)

NSMutableArray* scores;


scores = [NSMutableArray arrayWithArray:[defaults
objectForKey:@"HighScores"]];
[scores addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Andrew", @"Name", [NSNumber numberWithUnsignedInt:45], @"Score", nil]];
[scores addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"Andrew2", @"Name", [NSNumber numberWithUnsignedInt:55], @"Score", nil]];
[scores sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"Score" ascending:NO] autorelease]]];

答案 5 :(得分:0)

将NSMutableArray排序为日期列,您可以使用此代码的任何格式日期。

 NSSortDescriptor *sorter =[[NSSortDescriptor alloc] initWithKey:@"Date column name" ascending:sortCheck selector:@selector(compare:)];
                    [itemsData sortUsingDescriptors:[NSArray arrayWithObject:sorter]];

答案 6 :(得分:0)

这是我的解决方案。

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {

[[DateFormatter sharedDateFormatter]setDateStyle:NSDateFormatterShortStyle];
NSDate *d1 = [[DateFormatter sharedDateFormatter] dateFromString:s1];
NSDate *d2 = [[DateFormatter sharedDateFormatter] dateFromString:s2];
return [d1 compare:d2];

}

这会将日期(当前为字符串)转换为日期,然后对其进行比较。 sharedDateFormatter是NSDateFormatter的单例类,所以我不必每次都分配它。

我不会在项目中使用它,它挂起主线程,但它可能对某人有帮助。如果有人知道更好的方法来做到这一点,那就不会阻止主线程,我很欣赏它。