在 NSArray 中添加缺失的日期

Posted

技术标签:

【中文标题】在 NSArray 中添加缺失的日期【英文标题】:Adding Missing Dates in NSArray 【发布时间】:2015-01-27 20:49:29 【问题描述】:

我有一个过去 5 天的数组。它是这样构建的:

(
    "2015-01-27",
    "2015-01-26",
    "2015-01-25",
    "2015-01-24",
    "2015-01-23",
)

我有第二个来自 FetchRequest 的 NSArray

(
    
        daySectionIdentifier = "2015-01-24";
        sumValue = 2500;
    ,
    
        daySectionIdentifier = "2015-01-25";
        sumValue = 1487;
    ,
    
        daySectionIdentifier = "2015-01-27";
        sumValue = 750;
    
)

我想要的是与我的第一个数组匹配的日期在第一个数组中得到一个值,缺少的日期没有值。

所以最终的结果会是这样的:

(
    
        daySectionIdentifier = "2015-01-23";
        sumValue = 0;
    ,
    
        daySectionIdentifier = "2015-01-24";
        sumValue = 2500;
    ,
    
        daySectionIdentifier = "2015-01-25";
        sumValue = 1000;
    ,
    
        daySectionIdentifier = "2015-01-26";
        sumValue = 0;
    ,
    
        daySectionIdentifier = "2015-01-27";
        sumValue = 750;
    
)

有人知道怎么做吗?提前致谢

【问题讨论】:

你需要描述2015-01-27 (Value:56)的数据结构。这个对象是什么?我们如何构建这些对象中的一个新对象? 谢谢伊恩。它来自 Cora 数据对象上的 fetchRequest。它带有 2 个属性。一个是 NSString YYYY-MM-DD,第二个字段是浮点数。我这样检索它: NSPropertyDescription *daySectionIdentifierProperty = entity.propertiesByName[@"daySectionIdentifier"]; fetchRequest.propertiesToFetch = [NSArray arrayWithObjects:daySectionIdentifierProperty,sumExpressionDescription,nil]; fetchRequest.propertiesToGroupBy = @[daySectionIdentifierProperty]; 您能否使用此代码更新您的问题,因为这不可读。 不过,您还没有真正告诉我们如何构建一个新的;这仅描述了您如何检索现有实例。 到您想要使用第二个数组时,我仍然不清楚它实际上包含什么。你能举个例子吗? 【参考方案1】:

好的,所以这并没有太难,希望这就是你所追求的:

首先考虑这个问题,这里的问题是让数据以正确的格式进行分析,所以首先我将它从一个充满字典的数组更改为一个数组数组,每个数组都包含信息(我不知道最优雅的解决方案,但仍然有效)

// Here is our array of past dates
NSArray * pastDateDays = @[@"2015-01-27", @"2015-01-26", @"2015-01-25", @"2015-01-24", @"2015-01-23"];

// Here is our array from the request, this is full of dictionaries
NSArray * fetchRequest = @[@@"daySectionIdentifier" : @"2015-01-24", @"sumValue": @2500, @@"daySectionIdentifier" : @"2015-01-25", @"sumValue": @1487, @@"daySectionIdentifier" : @"2015-01-27", @"sumValue": @750];

// Here is a mutable array we will be adding to
NSMutableArray * request = [NSMutableArray arrayWithArray:fetchRequest];

所以现在我们准备开始将信息转换成更好的格式。

// This function gets the array in an array of arrays where each array has a date and a value
fetchRequest = [self fetchRequestToArray:fetchRequest];

// Not too complicated just taking it out of one and putting it in another
- (NSArray *)fetchRequestToArray: (NSArray *)array 

    NSMutableArray * tempArray = [NSMutableArray new];

    for (NSDictionary * dict in array) 

        NSArray * temp = @[[dict objectForKey:@"daySectionIdentifier"], [dict objectForKey:@"sumValue"]];

        [tempArray addObject:temp];
    

    return [NSArray arrayWithArray:tempArray];

接下来,我们遍历日期数组中的一个可变日期数组,如果它们在我们请求的数组中匹配,我们将其删除:

NSMutableArray * tempDates = [NSMutableArray arrayWithArray:pastDateDays];

for (NSArray * array in fetchRequest) 

    NSString * date = array.firstObject;

    for (NSString * string in pastDateDays) 

        if ([date isEqualToString:string]) 

            [tempDates removeObject:string];
        
    

这给我们留下了一个日期数组,这些日期包含在我们的日期数组中,但不包含在我们请求的数据中。这些是我们需要为其添加零值的日期。

这还是比较简单的:

for (NSString * date in tempDates) 

    NSDictionary * dict = [NSDictionary dictionaryWithObjects:@[date, @0]
                                                           forKeys:@[@"daySectionIdentifier", @"sumValue"]];

    [request addObject:dict];

这会返回我们想要的数组。

唯一可能需要添加的是该数组不是按日期顺序排列的。这可以通过多种方法轻松排序。我在几秒钟内找到并添加了它,但如果需要,您可以选择更复杂的:

NSSortDescriptor * sortByDate = [NSSortDescriptor sortDescriptorWithKey:@"daySectionIdentifier"
                                                             ascending:YES];
NSArray * sortDescriptors = [NSArray arrayWithObject:sortByDate];
NSArray * sortedArray = [request sortedArrayUsingDescriptors:sortDescriptors];

这将以以下格式输出日期:

最后的数组是request的数组,是一个mutableArray

<__NSArrayI 0x7fade848f480>(

    daySectionIdentifier = "2015-01-23";
    sumValue = 0;
,

    daySectionIdentifier = "2015-01-24";
    sumValue = 2500;
,

    daySectionIdentifier = "2015-01-25";
    sumValue = 1487;
,

    daySectionIdentifier = "2015-01-26";
    sumValue = 0;
,

    daySectionIdentifier = "2015-01-27";
    sumValue = 750;

)

我认为这是期望的输出。

注意事项: - 值是 NSNumbers 而不是整数,因为我们不能在 NSdictionary 中存储整数

这不是最优雅的解决方案 - 我使用了很多数组,我确信它可以被重构。虽然这段代码确实有效,因此可以用来建立理解 - 直接复制这段代码时应该可以工作,但可能有一些事情需要调整,因为它是从我的 XCode 复制的一个长答案

字符串必须完全采用这种格式才能工作,如果不是,则需要调整此解决方案。

希望对你有帮助

【讨论】:

你就是那个男人。非常感谢weesplodge。一切都很完美。真的很感激。再次感谢。当我获得足够的声望点时,我将不得不投票给你。

以上是关于在 NSArray 中添加缺失的日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSArray 中检查 NSDate yyyy/mm/dd 并进行比较?

NSArray 中的 NSDictionary

如何通过数组对象的 NSDate 日期将 NSArray 拆分为 NSDictionary?

在 for 循环中添加到 NSArray 会导致重复?

如何判断对象是不是在 NSArray 中?

NSArray 中的 NSObject 的属性是不是会发生变化,或者是不是必须再次将它们添加到 NSArray?