2015-12-19 15 views
3

我有数组与下面的结构,我想从该数组中获得唯一的一年数组。从数组中获取独特的年份

我已经得到所需的输出使用循环,但可以提出更好的方式来获得所需的输出。

[ 
    { date = "2015-12-19 11:56:51 +0000"; }, 
    { date = "2015-12-19 11:56:51 +0000"; }, 
    { date = "2015-12-19 11:56:52 +0000"; }, 
    { date = "2013-11-19 11:56:52 +0000"; }, 
    { date = "2013-09-20 11:56:52 +0000"; }, 
    { date = "2014-12-07 11:56:58 +0000"; }, 
    { date = "2015-12-19 11:57:03 +0000"; }, 
    { date = "2012-08-08 11:57:07 +0000"; }, 
    { date = "2010-08-19 11:57:20 +0000"; } 
] 

对于上面阵列输出阵列应采用 [ “2015”, “2014”, “2013”​​, “2012”, “2010”]

这里是我使用的现在的代码:

NSMutableSet *setDate = [NSMutableSet set]; 
for (NSDictionary *dicData in arrayDates) { 
    NSString *strDate = [[dicData valueForKeyPath:@"date"] substringToIndex:4]; 
    // my date format always same so no issue with substring 
    [setDate addObject:strDate]; 
} 
+0

到目前为止您尝试了什么?在数组中循环,将字符串转换为Date,将年份从中取出,如果它不包含年份,则将其放入数组中。 – luk2302

+0

@ luk2302我已经完成了那一个,除此之外,我们是否有任何解决方案? – Narayana

回答

4

一种方法或其他你需要循环数组的元素。它可以是“for”循环,“foreach”循环或enumerateObjectsUsingBlock:,但循环将在那里。

由于年份是相对较小的整数,收集输出的一种方法是使用NSIndexSet。这个集合非常快,并且总是排序。下面是一个使用enumerateObjectsUsingBlock:

NSMutableIndexSet *res = [NSMutableIndexSet indexSet]; 
[myDates enumerateObjectsUsingBlock:^(id d, NSUInteger index, BOOL *stop){ 
    NSDateComponents *dc = [[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:d]; 
    [res addIndex:[dc year]]; 
}]; 

现在res包含日期独特年在NSArray的解决方案。

0

与dasblinkenlight在他的回答中所说的相反,这可以在没有循环的情况下完成(至少,不需要明确地写循环;-)。

您可以NSDate添加类别,包含返回一年方法:

@interface NSDate (Year) 

- (NSInteger)my_year; 

@end 

@implementation NSDate (Year) 

- (NSInteger)my_year 
{ 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:self]; 
    return components.year; 
} 

@end 

然后你可以使用键 - 值编码的功率:

//look, ma! no loops! no set! 
NSArray *uniqueYears = [dates valueForKeyPath:@"@distinctUnionOfObjects.my_year"]; 

当然写类只是为了这个目的是一种矫枉过正。但方法my_year可以在可以提供关键路径的其他地方重新使用。例如,您可以使用NSPredicate轻松获得特定年份的(或自此)的日期。