我有两个NSArrays
,他们都有不同的键为他们创建的JSON值。第一个数组是Twitter推文列表,每个对象的NSDate
键值为created_at
值。其他NSArray
我有一个Instagram图片列表和NSDate
对象的值是created_time
。我如何将这两个数组放入另一个NSArray
并根据对象的时间对每个值进行排序?我如何将这两个阵列放入前面所述的相同规格的NSDictionary
?比较两个不同的NSArrays的NSDates
回答
合并两个数组:
NSMutableArray *combinedArr = [[originalArray1 arrayByAddingObjectsFromArray:
originalArray2] mutableCopy];
排序的NSMutableArray
:
- 编写将返回一个
NSComparisonResult
描述如何你排序对象应进行排序的方法。如果您使用的是类似NSDate
的东西,可能已经有一种方法可以为您做到这一点。 - 根据该方法写在手,并准备好了,对数组进行排序:
[arrToBeSorted sortUsingSelector:@selector(yourSortMethod:)];
上组建的排序方法的一个例子:
首先,你需要返回NSComparisonResult
。你需要接受的论点应该是你调用该方法的同一个类的一个对象(我们将对象A和对象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:)];
一种会比objectB
小的指数与objectA
返回数组。
NSOrderedDescending
只会做相反的事情
NSOrderedSame
说,进行这种比较,这两个对象是相等的,所以也无所谓订单是否是objectA
,objectB
,或objectB
,objectA
,所以相比时,这两个对象永远不会交换位置。如果它们与objectC
或objectD
排列在一个阵列中,则A和B将按照相对于C和D的正确顺序排序,但A和B将不会彼此交换,因为NSOrderedSame
表示它们的顺序,相对彼此,并不重要。
这就是你正在做的所有与NSComparisonResult
。您将返回一个值,告诉调用方如何将这两个对象相对于彼此进行排序。该NSMutableArray
方法sortUsingSelector:
通过所有对象使用给定的选择和迭代,让他们都在正确的顺序,因此对于阵列中的每个对象,一切都将返回给定selector
阵列与分类NSOrderedDescending
或NSOrderedSame
面前,它之后的所有内容将返回NSOrderedAscending
或NSOrderedSame
。
*作为一个说明,为了正确工作,数组中的所有内容都需要以相同的逻辑响应排序选择器。如果你编写的方法orderByDate
按某种object.date
属性排序,那很好,只要数组中的每个对象都有orderByDate
方法(和其中的相同逻辑),.date
属性,并且它们都将以逻辑方式响应办法。如果你在那里扔出NSString
,你会遇到问题(运行时异常)。如果[objectA compareObjects:objectB]
返回NSOrderedAscending
,则[objectB compareObjects: objectA];
必须返回NSOrderedDescending
。
为了将它们放入字典中,您必须更清楚地了解字典的预期结构。
有很多方法可以做你想做的。以下是一种方法。
- 的资料Tweet和Instagram图片
写一个适配器方法返回该项目的创建日期
类创建类:鸣叫
- (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. 不能比较两个NSDates
- 2. 比较两个NSDates
- 3. 比较两个NSArrays
- 4. 比较两个NSDates在iPhone
- 5. 比较两个NSDates带来的误报
- 6. 如何比较ReactiveCocoa中的两个NSArrays
- 7. 比较两个在不同时区的NSDates
- 8. 如何比较两个不同值的nsarrays?
- 9. 比较两个NSDates日,月,年整数
- 10. 比较同一日期/时间的两个NSDates
- 11. 比较NSDates
- 12. 比较2 NSArrays?
- 13. 如何将NSArray中的对象与两个不同NSArrays中的两个不同对象进行比较?
- 14. 如何比较NSdates?
- 15. ios:如何比较2个不同格式的NSdates?
- 16. 如何比较两个不同表的两个不同的行?
- 17. 比较两个返回0或相等的NSDates
- 18. 比较来自核心数据的两个NSDates
- 19. XCTAssertEqual:如何比较NSDates?
- 20. 比较NSDates在objective-c
- 21. 比较两个不同的列表
- 22. 比较两个不同的数据库
- 23. 比较两个不同表中的列
- 24. 比较两个不同对象的值
- 25. 比较不同类型的两个值
- 26. 如何比较两个不同的IP?
- 27. 比较NSDates而不考虑时间
- 28. 在两个NSArrays中优雅比较字符串
- 29. 从两个NSDates
- 30. Xquery函数来比较两个不同的xmls的两个xpaths
你能告诉我一个构造方法的例子吗? – Prad
@ prnk28如果编辑了我的答案。 – nhgrif
我编辑了我的问题以添加代码 – Prad