我有兩個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