У меня есть два NSArrays
, и оба они имеют разные ключи для своего JSON, созданного по значению. Первый массив - это список твитов Twitter, а для каждого объекта - NSDate
. Другой NSArray
У меня есть список фотографий Instagram и значение NSDate
для объекта: created_time
. Как бы поместить оба этих массива в другое NSArray
и отсортировать каждое значение в зависимости от времени объекта? Как бы я поставил оба массива в NSDictionary
тех же спецификаций, которые были указаны ранее?Сравнение NSDates двух разных NSArrays
ответ
Объединение двух массивов:
NSMutableArray *combinedArr = [[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];
, что А предшествует в этой логике. Таким образом, своего рода, используя [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
, это прекрасно, если каждый объект в массиве имеет метод orderByDate
(и ту же логику в нем), свойство .date
, и все они будут реагировать логически путь. Если вы выбрали NSString
, у вас возникнут проблемы (исключение времени выполнения). Если [objectA compareObjects:objectB]
возвращает NSOrderedAscending
, то [objectB compareObjects: objectA];
должен вернуть NSOrderedDescending
.
Для того, чтобы помещать их в словарь, вы должны быть более четкими в отношении предполагаемой структуры словаря.
Существует много способов сделать то, что вы хотите. Ниже приведен подход.
- Создание классов для твита Instagram Изображения
Написать метод адаптера вернуть созданные даты детали в
Класс: Tweet
- (NSDate *)createdDate { return self.created_at; }
Класс: InstagramPicture
- (NSDate *)createdDate { return self.created_time; }
Объединить оба входных массивов
NSMutableArray *combinedArray = [[NSMutableArray alloc] init]; [combinedArray addObjectsFromArray:tweets]; [combinedArray addObjectsFromArray:instagramPictures];
Сортировать объединенный массив компаратором
NSArray *sortedCombinedArray = [combinedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1.createdDate compare:obj2.createdDate]; }];
Я отредактировал мой вопрос, чтобы добавить код. – Prad
Как nhgrif сказал Объединение двух массивов по:
NSMutableArray *combinedArr = [[originalArray1 arrayByAddingObjectsFromArray:
originalArray2] mutableCopy];
И для сортировки массива
-(NSMutableArray *)sortArrayBasedOndate:(NSMutableArray *)combinedArr
{
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];
[combinedArr sortUsingDescriptors:@[sortDesc1, sortDesc2]];
return combinedArr;
}
Попробуйте это.
Я отредактировал вопрос, чтобы добавить код. – Prad
Проблема в том, что вы отправляете объект сообщение, на которое он не может ответить. В этом случае похоже, что StreamViewController не может ответить на сообщение sortArrayBasedOndate :. Используйте пункты и журналы breaK и узнайте, где он сбой. –
- 1. Сравнение двух NSArrays
- 2. Сравнение NSDates
- 3. элегантный сравнение строк в двух NSArrays
- 4. Сравнение времени двух NSDates, игнорирование компонента даты
- 5. Сравнение двух идентичных NSDates, возвращающих неравный результат
- 6. Сравнение двух NSDates, возвращающих 0 или равных
- 7. Сравнение двух NSDates из основных данных
- 8. Сравнение двух NSDates постоянно даже вне приложения
- 9. Сравнение двух NSDates возвращает ложные срабатывания
- 10. Сравнение двух разных arrayList
- 11. Сравнение двух разных файлов
- 12. Сравнение двух компонентов даты из разных календарей
- 13. Сравнение NSDates во временных часах
- 14. Сравнение NSDates без учета времени
- 15. Сравнение NSDates в объективе-c
- 16. Сравнение двух чисел дня, месяца и года NSDates
- 17. Сравнение двух ArrayList разных типов
- 18. Сравнение двух списков разных строк
- 19. Сравнение двух перечней разных объектов
- 20. Сравнение значений двух разных объектов
- 21. Сравнение объектов двух разных классов?
- 22. Сравнение двух результатов двух разных таблиц
- 23. Сравнение двух столбцов из двух разных таблиц
- 24. Сравнение двух кортежей в двух разных файлах
- 25. Сравнение двух столбцов в двух разных таблицах?
- 26. Сравнение двух столбцов двух разных кадров данных
- 27. Создание массива CGPoints путем сопоставления значений из двух разных NSArrays
- 28. Сравнение двух NSDate
- 29. Сравнение NSDates для определения дня или ночи?
- 30. Сравнение двух массивов
Не могли бы вы показать мне пример способа построения метода? – Prad
@ prnk28 Если отредактировал мой ответ. – nhgrif
Я отредактировал мой вопрос, чтобы добавить код – Prad