在NSArray中添加缺失日期

时间:2015-01-27 20:49:29

标签: ios objective-c arrays nsarray nsfetchedresultscontroller

我有一个过去5天的数组。它构建如下:

(     " 2015年1月27日&#34 ;,     " 2015年1月26日&#34 ;,     " 2015年1月25日&#34 ;,     " 2015年1月24日&#34 ;,     " 2015年1月23日&#34 ;, )

我有来自FetchRequest的第二个NSArray

(         {         daySectionIdentifier =" 2015-01-24&#34 ;;         sumValue = 2500;     },         {         daySectionIdentifier =" 2015-01-25&#34 ;;         sumValue = 1487;     },         {         daySectionIdentifier =" 2015-01-27&#34 ;;         sumValue = 750;     } )

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

所以最终结果如下:

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

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

1 个答案:

答案 0 :(得分:0)

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

首先考虑问题,这里的问题在于以正确的格式获取数据以便能够分析,所以首先我将它从填充了字典的数组更改为数组数组,每个数组包含信息(我不知道最优雅的解决方案,但不是最好的解决方案)

// 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复制的长答案

  • 字符串需要采用这种格式才能正常工作,如果不是,则需要对此解决方案进行调整。

我希望这会有所帮助