我有两个NSArrays
,并且它们都有不同的键,用于创建值为的JSON。第一个数组是Twitter推文列表,每个对象的NSDate
键是created_at
值。我拥有的另一个NSArray
是Instagram图片列表,该对象的NSDate
值为created_time
。我如何将这两个数组放入另一个NSArray
并根据对象的时间对每个值进行排序?我如何将这两个数组放入前面所述相同规格的NSDictionary
中?
答案 0 :(得分:2)
组合两个数组:
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];
时,A会出现在B之前。因此,使用[arrToBeSorted sortUsingSelector:@selector(compareObjects:)];
的排序会在小于objectA
的索引中返回带有objectB
的数组。
NSOrderedDescending
会恰恰相反。
NSOrderedSame
表示,对于此比较,这两个对象是等效的,因此订单是objectA
,objectB
还是objectB
,{无关紧要{1}},所以相比之下,这两个对象永远不会交换位置。如果将它们放入带有objectA
或objectC
的数组中,则A和B将按照相对于C和D的正确顺序排序,但A和B不会相互交换因为objectD
说他们相对于彼此的顺序并不重要。
这就是你用NSOrderedSame
所做的一切。您将返回一个值,告诉调用者这两个对象应如何相对于彼此进行排序。 NSComparisonResult
方法NSMutableArray
使用给定的选择器并遍历所有对象以按正确的顺序获取所有对象,因此对于数组中的每个对象,它之前的所有内容都将返回sortUsingSelector:
或NSOrderedDescending
对于给定的NSOrderedSame
数组进行了排序,其后的所有内容都将返回selector
或NSOrderedAscending
。
* 作为一个注释,为了使其正常工作,数组中的所有内容都需要使用相同的逻辑响应排序选择器。如果你编写一个按NSOrderedSame
属性排序的方法orderByDate
,那很好,只要数组中的每个对象都有object.date
方法(并且其中包含相同的逻辑), orderByDate
属性,他们都会以合理的方式回应。如果你在那里抛出.date
,你就会遇到问题(运行时异常)。如果NSString
返回[objectA compareObjects:objectB]
,则NSOrderedAscending
必须返回[objectB compareObjects: objectA];
。
要将它们放入字典中,您必须更清楚地了解字典的预期结构。
答案 1 :(得分:1)
有很多方法可以做你想要的。以下是一种方法。
编写适配器方法以返回项目的创建日期
课程:鸣叫
- (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];
}];
答案 2 :(得分:1)
as 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;
}
试试这个。