2013-12-14 106 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点和日志,找出崩溃的位置。 –