Objective c 将另一个数组上的数组元素分组
我有一个对象数组,每个对象都有一个日期。Objective c 将另一个数组上的数组元素分组,objective-c,nsmutablearray,Objective C,Nsmutablearray,我有一个对象数组,每个对象都有一个日期。 我想在另一个数组中对每个具有相同日期的对象进行分组。 我的想法是:按对象的日期对数组进行排序,对于数组中的每个对象,执行以下操作:如果索引i处的对象与索引i+1处的对象具有相同的日期,则将索引i处的对象添加到临时数组中;否则,将索引i处的对象添加到临时数组,将该数组添加到输出数组,并从临时数组中删除所有对象 我的代码是: - (void) group{ NSMutableArray *aux = [[NSMutableArray alloc] init]
我想在另一个数组中对每个具有相同日期的对象进行分组。 我的想法是:按对象的日期对数组进行排序,对于数组中的每个对象,执行以下操作:如果索引i处的对象与索引i+1处的对象具有相同的日期,则将索引i处的对象添加到临时数组中;否则,将索引i处的对象添加到临时数组,将该数组添加到输出数组,并从临时数组中删除所有对象 我的代码是:
- (void) group{
NSMutableArray *aux = [[NSMutableArray alloc] init];
MyObject *currentObject;
MyObject *nextObject;
// Sort array
NSArray *sortedArray;
sortedArray = [_storeManager.activities sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(MyObject *)a date];
NSDate *second = [(MyObject *)b date];
return [first compare:second];
}];
// Grouping array
if ([sortedArray count] > 0) {
for (int i = 0; i < [sortedArray count] -1 ; i++) {
currentObject = sortedArray[i];
nextObject = sortedArray[i+1];
int currentDayObject = [currentObject getDayOfDate];
int currentMonthObject = [currentObject getMonthOfDate];
int currentYearObject = [currentObject getYearOfDate];
int nextDayObject = [nextObject getDayOfDate];
int nextMonthObject = [nextObject getMonthOfDate];
int nextYearObject = [nextObject getYearOfDate];
if ((currentDayObject == nextDayObject) && (currentMonthObject == nextMonthObject) && (currentYearObject == nextYearObject)) {
[aux addObject:currentObject];
} else {
[aux addObject:currentObject];
[_grouped addObject:aux];
[aux removeAllObjects];
}
}
[_grouped addObject:aux];
}
-(void)组{
NSMutableArray*aux=[[NSMutableArray alloc]init];
MyObject*currentObject;
MyObject*nextObject;
//排序数组
NSArray*Darray;
sortedArray=[\u storeManager.activities sortedArray使用Comparator:^n比较结果(id a,id b){
NSDate*first=[(MyObject*)a日期];
NSDate*秒=[(MyObject*)b日期];
返回[第一次比较:第二次];
}];
//分组数组
如果([SorterDarray count]>0){
对于(int i=0;i<[sorteddarray count]-1;i++){
currentObject=Darray[i];
nextObject=sortedArray[i+1];
int currentDayObject=[currentObject getDayOfDate];
int currentMonthObject=[currentObject getMonthOfDate];
int currentYearObject=[currentObject getYearOfDate];
int nextDayObject=[nextObject getDayOfDate];
int nextMonthObject=[nextObject GetMonthOffdate];
int-nextYearObject=[nextObject getYearOfDate];
如果((currentDayObject==nextDayObject)&&(currentMonthObject==nextMonthObject)&&(currentYearObject==nextYearObject)){
[辅助添加对象:当前对象];
}否则{
[辅助添加对象:当前对象];
[_:aux];
[辅助删除所有对象];
}
}
[_:aux];
}
为什么如果我执行
NSLog(@“分组%d上的项目,[\u分组计数]);
它总是返回0?您可以使用筛选器数组执行此操作,它为您提供具有不同日期的所有对象:
NSArray *distinct = [_storeManager.activities valueForKeyPath:@"@distinctUnionOfObjects.date"]
现在,您必须创建循环来枚举所有对象,并使用日期谓词对其进行过滤:
for(NSString *dateAsString in distinct)
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date == %@)", dateAsString];
NSArray *arrayForTheSameDay = [_storeManager.activities filteredArrayUsingPredicate: predicate];
}
您只需修改此代码以匹配您的属性
扩展:
如果要忽略创建开始日期和结束日期所需的时间,并将谓词更改为:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];
NSPredicate*predicate=[NSPredicate predicateWithFormat:@”(日期>=%@)和(日期建议:使用NSMutableDictionary
,日期作为键,NSMutableArray
s作为值
您不必对初始数组进行排序。只需遍历它,对于遇到的每个日期,查看字典中是否已经存在该日期的键。如果没有,请创建一个数组并将其添加到字典中,并将日期作为键。如果找到了日期,则获取对应于键的数组并将新对象添加到该数组中
最后,您应该有一个NSMutableDictionary
,其中所有不同的日期都作为键,所有相应的对象都作为这些键的值。可以将其视为频率分析
至于您关于分组计数为零的问题,对不起,我没有按照代码进行操作。“我想在另一个数组上对每个具有相同日期的对象进行分组。”是否使用NSMutableDictionary(key=date,value=same date对象的数组)在您的情况下是否有效?很遗憾,我应该使用NSMutableArray。谢谢,是否可以仅从日期筛选年、月、日期?因为日期对象有小时和秒,所以它们都是不同的。@mattyahtzee实现您想要的最快方法是在将对象添加到数组中并将日期格式化为日期时创建nsdateformatter仅包含年、月和日。从哪个数组?很遗憾,我无法修改数组\u storeManager.activities,因为小时和分钟对应用程序的另一部分很有用。代码更少,技术性很强。