在 NSArray 中添加缺失日期
Adding Missing Dates in NSArray
我有一个包含过去 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;
}
)
有人知道如何做到这一点吗?提前致谢
好的,事实证明这并不太难,希望这就是您所追求的:
首先考虑这个问题,这里的问题是让数据以正确的格式进行分析,所以首先我把它从一个充满字典的数组改为一个数组数组,每个数组都有包含信息(我知道这不是最优雅的解决方案,但最有效的解决方案 none 较少)
// 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];
}
这 returns 我们得到了所需的数组。
唯一可能需要添加的是此数组未按日期顺序排列。这可以使用多种方法轻松排序。我在几秒钟内找到并添加了这个,但如果需要,您可以选择更复杂的:
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[=16= 复制的一个很长的答案]
字符串需要完全采用这种格式才能工作,如果不是,则需要调整此解决方案。
希望对您有所帮助
我有一个包含过去 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;
}
)
有人知道如何做到这一点吗?提前致谢
好的,事实证明这并不太难,希望这就是您所追求的:
首先考虑这个问题,这里的问题是让数据以正确的格式进行分析,所以首先我把它从一个充满字典的数组改为一个数组数组,每个数组都有包含信息(我知道这不是最优雅的解决方案,但最有效的解决方案 none 较少)
// 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];
}
这 returns 我们得到了所需的数组。
唯一可能需要添加的是此数组未按日期顺序排列。这可以使用多种方法轻松排序。我在几秒钟内找到并添加了这个,但如果需要,您可以选择更复杂的:
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[=16= 复制的一个很长的答案]
字符串需要完全采用这种格式才能工作,如果不是,则需要调整此解决方案。
希望对您有所帮助