2013-12-14 103 views
0

我有兩個NSArrays,他們都有不同的鍵爲他們創建的JSON值。第一個數組是Twitter推文列表,每個對象的NSDate鍵值爲created_at值。其他NSArray我有一個Instagram圖片列表和NSDate對象的值是created_time。我如何將這兩個數組放入另一個NSArray並根據對象的時間對每個值進行排序?我如何將這兩個陣列放入前面所述的相同規格的NSDictionary比較兩個不同的NSArrays的NSDates

回答

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];,是一個接在B這個邏輯之前。因此,使用[arrToBeSorted sortUsingSelector:@selector(compareObjects:)];一種會比objectB小的指數與objectA返回數組。

NSOrderedDescending只會做相反的事情

NSOrderedSame說,進行這種比較,這兩個對象是相等的,所以也無所謂訂單是否是objectAobjectB,或objectBobjectA,所以相比時,這兩個對象永遠不會交換位置。如果它們與objectCobjectD排列在一個陣列中,則A和B將按照相對於C和D的正確順序排序,但A和B將不會彼此交換,因爲NSOrderedSame表示它們的順序,相對彼此,並不重要。

這就是你正在做的所有與NSComparisonResult。您將返回一個值,告訴調用方如何將這兩個對象相對於彼此進行排序。該NSMutableArray方法sortUsingSelector:通過所有對象使用給定的選擇和迭代,讓他們都在正確的順序,因此對於陣列中的每個對象,一切都將返回給定selector陣列與分類NSOrderedDescendingNSOrderedSame面前,它之後的所有內容將返回NSOrderedAscendingNSOrderedSame

*作爲一個說明,爲了正確工作,數組中的所有內容都需要以相同的邏輯響應排序選擇器。如果你編寫的方法orderByDate按某種object.date屬性排序,那很好,只要數組中的每個對象都有orderByDate方法(和其中的相同邏輯),.date屬性,並且它們都將以邏輯方式響應辦法。如果你在那裏扔出NSString,你會遇到問題(運行時異常)。如果[objectA compareObjects:objectB]返回NSOrderedAscending,則[objectB compareObjects: objectA];必須返回NSOrderedDescending


爲了將它們放入字典中,您必須更清楚地瞭解字典的預期結構。

+0

你能告訴我一個構造方法的例子嗎? – Prad

+0

@ prnk28如果編輯了我的答案。 – nhgrif

+0

我編輯了我的問題以添加代碼 – Prad

1

有很多方法可以做你想做的。以下是一種方法。

  1. 的資料Tweet和Instagram圖片
  2. 寫一個適配器方法返回該項目的創建日期

    類創建類:鳴叫

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

    類:InstagramPicture

    - (NSDate *)createdDate { 
        return self.created_time; 
    } 
    
  3. 結合兩個輸入陣列

    NSMutableArray *combinedArray = [[NSMutableArray alloc] init]; 
    [combinedArray addObjectsFromArray:tweets]; 
    [combinedArray addObjectsFromArray:instagramPictures]; 
    
  4. 排序比較器組合的陣列

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

我已編輯我的問題以添加代碼。 – Prad

1

作爲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; 
} 

試試這個。

+0

我編輯了這個問題來添加代碼。 – Prad

+0

問題是,你發送一個對象無法回覆的消息。在這種情況下,它看起來像StreamViewController無法響應消息sortArrayBasedOndate :.在那裏使用breaK點和日誌,找出崩潰的位置。 –