Сортировка массива в соответствии с датой, Проблема - это дата, сохраненная в строковом формате. Это возможно для сортировки массива без даты изменения в объекте NSDate. (Core Data).сортировка массива в соответствии с датой
строка формат мм/дд/гггг
Сортировка массива в соответствии с датой, Проблема - это дата, сохраненная в строковом формате. Это возможно для сортировки массива без даты изменения в объекте NSDate. (Core Data).сортировка массива в соответствии с датой
строка формат мм/дд/гггг
-(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;
}
Это работает для меня.
Если дата хранится в формате, где алфавитные сортировки эквивалентна дату сортировать, то она не может быть сделана с основными данными. В этом случае у вас есть два варианта:
Вы можете создать сортировку с sortDescriptorWithKey:ascending:comparator: и предоставить блок, который будет сравнивать любые две строки даты. Доступно в iOS 4.0 и более поздних версиях.
Способ использования здесь - метод 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
}
Вы будете нуждаться в собственную логику, чтобы выделить год, месяц, дата и строки так что вы можете сравнить их. Я не уверен, что это меньше работы, чем преобразование строк в даты, как предложил Деннис, но вы знаете, что ваша программа так делает то, что работает.
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]]];
Сортировка NSMutableArray в качестве столбца даты, у вас есть дата форматирования, этот код работает нормально.
NSSortDescriptor *sorter =[[NSSortDescriptor alloc] initWithKey:@"Date column name" ascending:sortCheck selector:@selector(compare:)];
[itemsData sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
Это мое решение.
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];
}
Это принимает дату, которая в настоящее время является строкой, преобразует его в дату, а затем сравнивает его. ShareDateFormatter - это одноэлементный класс для NSDateFormatter, поэтому мне не придется выделять его каждый раз.
Я бы не использовал это в проекте, хотя он висит в основном потоке, но он может быть кому-то полезен. Если бы кто-то знал лучший способ сделать это, это не помешало бы основному потоку, я бы это оценил.
Что такое строковый формат - приведите пример! – deanWombourne 2010-11-30 12:41:18
Являются ли эти данные хранятся в обычных объектах в массиве или это управляемые объекты в графе Core Data? – TechZen 2010-11-30 20:23:56
это основные объекты данных и только способ доступа к дате с помощью. оператора с объектом основного объекта данных. – Ishu 2010-12-01 04:18:07