2010-11-30 3 views
1

Сортировка массива в соответствии с датой, Проблема - это дата, сохраненная в строковом формате. Это возможно для сортировки массива без даты изменения в объекте NSDate. (Core Data).сортировка массива в соответствии с датой

строка формат мм/дд/гггг

+0

Что такое строковый формат - приведите пример! – deanWombourne 2010-11-30 12:41:18

+0

Являются ли эти данные хранятся в обычных объектах в массиве или это управляемые объекты в графе Core Data? – TechZen 2010-11-30 20:23:56

+0

это основные объекты данных и только способ доступа к дате с помощью. оператора с объектом основного объекта данных. – Ishu 2010-12-01 04:18:07

ответ

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; 

} 

Это работает для меня.

0

Если дата хранится в формате, где алфавитные сортировки эквивалентна дату сортировать, то она не может быть сделана с основными данными. В этом случае у вас есть два варианта:

  1. Добавить новый атрибут NSDate в вашу базу данных и преобразовать каждую текстовую дату в реальную дату и обновить запись. Затем вы можете сортировать данные ядра.
  2. Извлечь все данные в массив в памяти, а затем отсортировать их с помощью специального метода сравнения.
1

Вы можете создать сортировку с sortDescriptorWithKey:ascending:comparator: и предоставить блок, который будет сравнивать любые две строки даты. Доступно в iOS 4.0 и более поздних версиях.

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 
} 

Вы будете нуждаться в собственную логику, чтобы выделить год, месяц, дата и строки так что вы можете сравнить их. Я не уверен, что это меньше работы, чем преобразование строк в даты, как предложил Деннис, но вы знаете, что ваша программа так делает то, что работает.

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

Сортировка NSMutableArray в качестве столбца даты, у вас есть дата форматирования, этот код работает нормально.

NSSortDescriptor *sorter =[[NSSortDescriptor alloc] initWithKey:@"Date column name" ascending:sortCheck selector:@selector(compare:)]; 
        [itemsData sortUsingDescriptors:[NSArray arrayWithObject:sorter]]; 
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]; 

}

Это принимает дату, которая в настоящее время является строкой, преобразует его в дату, а затем сравнивает его. ShareDateFormatter - это одноэлементный класс для NSDateFormatter, поэтому мне не придется выделять его каждый раз.

Я бы не использовал это в проекте, хотя он висит в основном потоке, но он может быть кому-то полезен. Если бы кто-то знал лучший способ сделать это, это не помешало бы основному потоку, я бы это оценил.

Смежные вопросы