Сравните NSDates двух разных NSArrays

У меня есть два NSArrays и у обоих из них есть разные ключи для своего JSON, созданного по значению. Первый массив - это список твитов Twitter, а ключ NSDate для каждого объекта - значение created_at. Другой NSArray меня есть список изображений Instagram, а значение NSDate для объекта created_time. Как бы поместить оба этих массива в другой NSArray и отсортировать каждое значение в зависимости от времени объекта? Как бы я поместил оба массива в NSDictionary из тех же спецификаций, которые были указаны ранее?

3 ответа

Объединение двух массивов:

NSMutableArray ************ = [[originalArray1 arrayByAddingObjectsFromArray: 
 originalArray2] mutableCopy];

Чтобы отсортировать NSMutableArray:

  • Напишите метод, который вернет NSComparisonResult чтобы описать, как сортировать объекты, которые вы сортируете. Если вы используете что-то вроде NSDate, вероятно, уже написан метод, который сделает это за вас.
  • С помощью этого метода, написанного, в руке и готового к работе, отсортируйте массив:
[arrToBeSorted sortUsingSelector:@selector(yourSortMethod:)];

Пример объединения метода сортировки:

Во-первых, вам нужно вернуть NSComparisonResult. И аргумент, который вам нужно принять, должен быть объектом того же класса, для которого вы вызываете метод (мы сравниваем Object A с Object B, оба из того же класса. И, наконец, вы ставите логику в метод для определения возвращаемого результата NSComparisonResult.

-(NSComparisonResult)compareObjects:(MyObjectClass*)objectB {
 // pseudo code:
 if(self comes before objectB) {
 return NSOrderedAscending;
 } else if(self comes after objectB) {
 return NSOrderedDescending;
 } else {
 return NSOrderedSame;
 }
}

NSOrderedAscending говорит, когда я делаю [objectA compareObjects: objectB]; , что А предшествует B этой логикой. Итак, сортировка с использованием [arrToBeSorted sortUsingSelector:@selector(compareObjects:)]; вернет массив с objectA в индекс, меньший, чем objectB.

NSOrderedDescending будет делать как раз наоборот.

NSOrderedSame говорит, что для этого сравнения эти два объекта эквивалентны, поэтому не имеет значения, является ли порядок objectA, objectB или objectB, objectA, поэтому при сравнении эти два объекта никогда не будут торговать. Если они помещены в массив с objectC или objectD, то A и B будут отсортированы в правильном порядке относительно C и D, но A и B не будут заменены друг на друга, потому что NSOrderedSame говорит, что их порядок, относительный друг другу, не имеет значения.

И это все, что вы делаете с NSComparisonResult. Вы возвращаете значение, которое сообщает вызывающему, как эти два объекта должны сортироваться относительно друг друга. Метод NSMutableArray sortUsingSelector: с помощью заданного селектора и итерации по всем объектам, чтобы получить их все в правильном порядке, поэтому для КАЖДОГО объекта в массиве все до того, как оно вернет NSOrderedDescending или NSOrderedSame для данного selector массив был отсортирован, и все после того, как оно вернет NSOrderedAscending или NSOrderedSame.

* В качестве примечания, чтобы это работало должным образом, все в массиве должно отвечать селектору сортировки с той же логикой. Если вы напишете метод orderByDate который сортирует каким- object.date свойством object.date, это прекрасно, если каждый объект в массиве имеет метод orderByDate (и та же логика в нем), свойство .date, и все они ответят логически. Если вы выбросите NSString там, у вас возникнут проблемы (исключение времени выполнения). Если [objectA compareObjects:objectB] возвращает NSOrderedAscending, тогда [objectB compareObjects: objectA]; должен возвращать NSOrderedDescending.

Для того, чтобы помещать их в словарь, вам нужно будет более четко определить предполагаемую структуру словаря.


Как сказал nhgrif, объедините два массива:

NSMutableArray ************ = [[originalArray1 arrayByAddingObjectsFromArray: 
 originalArray2] mutableCopy];

А для сортировки массива

-(NSMutableArray *)sortArrayBasedOndate:(NSMutableArray *)***********
{
 NSDateFormatter *fmtDate = [[NSDateFormatter alloc] init];
 [fmtDate setDateFormat:@"yyyy-MM-dd"];

 NSDateFormatter *fmtTime = [[NSDateFormatter alloc] init];
 [fmtTime setDateFormat:@"HH:mm"];

 NSComparator compareDates = ^(id string1, id string2)
 {
 NSDate *date1 = [fmtDate dateFromString:string1];
 NSDate *date2 = [fmtDate dateFromString:string2];

 return [date1 compare:date2];
 };

 NSComparator compareTimes = ^(id string1, id string2)
 {
 NSDate *time1 = [fmtTime dateFromString:string1];
 NSDate *time2 = [fmtTime dateFromString:string2];

 return [time1 compare:time2];
 };

 NSSortDescriptor * sortDesc1 = [[NSSortDescriptor alloc] initWithKey:@"start_date" ascending:YES comparator:compareDates];
 NSSortDescriptor * sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:@"starts" ascending:YES comparator:compareTimes];
 [*********** sortUsingDescriptors:@[sortDesc1, sortDesc2]];

 return ***********;
}

Попробуй это.


Есть много способов сделать то, что вы хотите. Ниже приведен подход.

  1. Создание классов для твитов и изображений Instagram
  2. Напишите метод адаптера, чтобы вернуть дату создания элемента

    Класс: Tweet

    - (NSDate *)createdDate {
     return self.created_at;
    }

    Класс: InstagramPicture

    - (NSDate *)createdDate {
     return self.created_time;
    }
  3. Объедините оба входных массива

    NSMutableArray ************** = [[NSMutableArray alloc] init];
    [************* addObjectsFromArray:tweets];
    [************* addObjectsFromArray:instagramPictures];
  4. Сортировка объединенного массива компаратором

    NSArray ******************** = [************* sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
     return [obj1.createdDate compare:obj2.createdDate];
    }];

licensed under cc by-sa 3.0 with attribution.