根据日期排序数组, 问题是以字符串格式保存的日期可以在NSDate对象中对数组进行排序而无需更改日期。(核心数据)。
字符串格式为mm / dd / yyyy
答案 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)
如果日期以字母排序等同于日期排序的格式存储,则无法使用核心数据。在这种情况下,您有两个选择:
答案 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的单例类,所以我不必每次都分配它。
我不会在项目中使用它,它挂起主线程,但它可能对某人有帮助。如果有人知道更好的方法来做到这一点,那就不会阻止主线程,我很欣赏它。