2013-12-05 6 views
0

У моих объектов есть метка времени и текст, временная метка - это NSDate, отформатированная до NSString перед сохранением. После создания нового объекта и установки его значений я его сохраняю. Позже при загрузке я помещал все объекты в массив и смешивал этот массив с другим массивом, поэтому мне нужно отсортировать массив.
Моя проблема: я не знаю, как правильно сортировать массив с помощью свойства timestamp объекта.
Я много искал, но до сих пор не получил актуального ответа. Любая помощь приветствуется.сортировать смешанный массив с объектами

+0

Используйте 'sortedArrayUsingComparator:'. В блоке компаратора преобразуйте метки времени NSString в объекты NSDate и «сравните:« один с другим ». – neilco

ответ

0

Попробуйте это;

NSArray *sortedArray = [unSortedArray sortedArrayUsingComparator: ^NSComparisonResult(DateObj *id1, DateObj *id2) { 
      if(id1.timeStamp > id2.timeStamp) 
       return NSOrderedAscending; 
      else if (id1.timeStamp < id2.timeStamp) 
       return NSOrderedDescending; 
      else return NSOrderedSame; 
     }]; 

Подробнее о сортировке HERE.

+2

'BOOL' (который имеет два возможных значения) не является синонимом для' NSComparisonResult' (который имеет три возможных значения). – neilco

+0

Используйте цикл для сравнения более двух значений. – KethanKumar

2

Для сравнения двух различных штампа времени вы должны преобразовать его в NSData первый:

-(NSDate)convertToDate:(NSString*)inputDate 
    //NSString *inputDate = @"11/20/2013 3:30:05 PM"; //<-- Your date probably is different than that 
    NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
    dateFormatter1.dateFormat = @"MM/dd/yyyy hh:mm:ss a"; //<-- this needs to be changet to match your time stamp format 
    [dateFormatter1 setLocale:[NSLocale currentLocale]]; 
    NSDate *date = [dateFormatter1 dateFromString:inputDate]; //<- this is your NSDate object. 
    return date; 
} 



NSArray *sortedArray = [unSortedArray sortedArrayUsingComparator: ^NSComparisonResult(DateObj *id1, DateObj *id2) { 
      NSDate d1 = [self convertToDate:id1.timeStamp]; 
      NSDate d2 = [self convertToDate:id2.timeStamp]; 
      return [d1 compare:d2]; 
     }]; 

Вы также можете добавить сравнить метод вашего класса, например:

- (NSComparisonResult)compare:(YourClass *)obj 
{ 
    NSDate d1 = [self convertToDate:self.timeStamp]; 
    NSDate d2 = [self convertToDate:obj.timeStamp]; 
    return [d1 compare:d2]; 
} 

И если вам нужно сортировать массив этого объекта вы звоните:

NSArray *sortedArray = [yourArray sortedArrayUsingSelector:@selector(compare:)]; 
0

Мое решение:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"dd.MM.YYYY HH:mm:ss"]; 
NSMutableArray *timeStamps = [[NSMutableArray alloc] init]; 
for(Object *object in allObjects) { 
    NSDate *time = [dateFormatter dateFromString:object.timeStamp]; 
    [timeStamps addObject:time]; 
} 

[timeStamps sortedArrayUsingSelector:@selector(compare:)]; 
NSMutableArray *sortedArray = [NSMutableArray arrayWithCapacity:[allObjects count]]; 

for(int i = 0; i < [timeStamps count]; i++) { 
    for(Object *object in allObjects) { 
     if(object.timeStamp == [dateFormatter stringFromDate:timeStamps[i]]) { 
      [sortedArray addObject:messageObject]; 
     } 
    } 
} 
return sortedArray; 
Смежные вопросы