比较两个不同NSArray的NSDates

时间:2013-12-14 05:29:43

标签: ios iphone objective-c arrays nsdate

我有两个NSArrays,并且它们都有不同的键,用于创建值为的JSON。第一个数组是Twitter推文列表,每个对象的NSDate键是created_at值。我拥有的另一个NSArray是Instagram图片列表,该对象的NSDate值为created_time。我如何将这两个数组放入另一个NSArray并根据对象的时间对每个值进行排序?我如何将这两个数组放入前面所述相同规格的NSDictionary中?

3 个答案:

答案 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表示,对于此比较,这两个对象是等效的,因此订单是objectAobjectB还是objectB,{无关紧要{1}},所以相比之下,这两个对象永远不会交换位置。如果将它们放入带有objectAobjectC的数组中,则A和B将按照相对于C和D的正确顺序排序,但A和B不会相互交换因为objectD说他们相对于彼此的顺序并不重要。

这就是你用NSOrderedSame所做的一切。您将返回一个值,告诉调用者这两个对象应如何相对于彼此进行排序。 NSComparisonResult方法NSMutableArray使用给定的选择器并遍历所有对象以按正确的顺序获取所有对象,因此对于数组中的每个对象,它之前的所有内容都将返回sortUsingSelector:NSOrderedDescending对于给定的NSOrderedSame数组进行了排序,其后的所有内容都将返回selectorNSOrderedAscending

* 作为一个注释,为了使其正常工作,数组中的所有内容都需要使用相同的逻辑响应排序选择器。如果你编写一个按NSOrderedSame属性排序的方法orderByDate,那很好,只要数组中的每个对象都有object.date方法(并且其中包含相同的逻辑), orderByDate属性,他们都会以合理的方式回应。如果你在那里抛出.date,你就会遇到问题(运行时异常)。如果NSString返回[objectA compareObjects:objectB],则NSOrderedAscending必须返回[objectB compareObjects: objectA];


要将它们放入字典中,您必须更清楚地了解字典的预期结构。

答案 1 :(得分: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];
    }];
    

答案 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;
}

试试这个。