我有一组格式为NSString
@"Aug 2013" @"July 2013" and so on...
个对象
我想在ascending order
中对这个数组进行排序。首先将个别值的日期作为一个好主意..?
答案 0 :(得分:5)
一个块中的其他解决方案
NSArray* array = [NSArray arrayWithObjects:@"Janvier 2012",@"Mars 2013", @"Juin 2013", @"Octobre 2012", nil];
NSArray* result = [array sortedArrayUsingComparator:^(id a, id b) {
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMMM YYYY"];
NSDate* datea = [dateFormat dateFromString:a];
NSDate* dateb = [dateFormat dateFromString:b];
return [datea compare:dateb];
}];
答案 1 :(得分:3)
我看到你更喜欢“字符串”(不是拼写错误)类型的变量。他们经常最终会给你这样的错误。你真正应该做的是将日期存储为日期。他们彼此很好地比较,你可以用它们进行奇特的日期计算。数字也是如此。
然后,如果您想在用户界面中显示“8月2013”或“2013年7月”:使用日期格式化程序将日期格式化为仅显示的相应字符串。
对于这种情况,您应该查看的两个主要类(阅读文档等)是:NSDate
和NSDateFormatter
。 NSCalendar
和NSDateComponents
也应该有用。
答案 2 :(得分:3)
我通过使用类别在NSDate和NSString之间来回切换来解决这类问题。我会通过使用类别转换为日期,排序,然后转换回来来解决这个问题。
我的类别如下所示(您需要添加类似的方法来管理字符串所具有的月/年格式)
#import "NSDate+Utils.h"
@implementation NSDate (NSDate_Utils)
+ (NSDate *)dateFromI18NString:(NSString *)dateString
{
if (dateString == nil)
return nil;
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss ZZZ";
NSDate *d = [dateFormatter dateFromString:dateString];
return d;
}
- (NSString *)dateToI18NString
{
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss ZZZ";
return [dateFormatter stringFromDate:self];
}
答案 3 :(得分:2)
我会使用NSArray
个NSDate
个对象,并根据需要格式化它的内容。
答案 4 :(得分:1)
您可以通过以下代码实现对数组进行排序。
-(void)somemethod{
NSArray *sortedArray = [[NSArray alloc]initWithArray:YOURARRAY];
sortedArray = [sortedArray sortedArrayUsingFunction:dateSort context:nil];
}
如上所述调用以下函数对数组进行排序。(根据数组的日期格式更新格式化程序)
NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM yyyy"];
NSDate *d1 = [formatter dateFromString:s1];
NSDate *d2 = [formatter dateFromString:s2];
return [d1 compare:d2]; // ascending order
return [d2 compare:d1]; // descending order
}
我希望,它可以帮到你。
答案 5 :(得分:1)
试试这个
- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *unsortedArray =[[NSArray alloc]initWithObjects:@"July 2013",@"Aug 2013",@"Jun 2012", nil];
NSMutableArray *arrSorted = [NSMutableArray arrayWithArray:unsortedArray];
for(int i=0;i<[arrSorted count];i++)
{
for(int j=i+1;j<[arrSorted count];j++)
{
NSDateFormatter *df=[[NSDateFormatter alloc] init];
df.dateFormat=@"MMM yyyy";
NSDate *date1=[df dateFromString:[arrSorted objectAtIndex:i]];
NSDate *date2=[df dateFromString:[arrSorted objectAtIndex:j]];
if([date1 compare:date2]== NSOrderedAscending)
{
[arrSorted exchangeObjectAtIndex:i withObjectAtIndex:j];
}
}
}
// ORDER_DESCEND
NSLog(@"%@",arrSorted);
arrSorted = [NSMutableArray arrayWithArray:[[arrSorted reverseObjectEnumerator] allObjects]];
// ORDER_ASCEND
NSLog(@"%@",arrSorted);
}
答案 6 :(得分:0)
- (NSArray *)sortedDateArrayWithExistedArray:(NSMutableArray *) setExistedArray acending:(BOOL)ascendingBoolvalue
{
NSArray *sortedArray = [setExistedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd MMM, yyyy"];
NSDate *d1 = [formatter dateFromString:obj1[@"displayDate"]];
NSDate *d2 = [formatter dateFromString:obj2[@"displayDate"]];
// id = [d1 compare:d2];
if (ascendingBoolvalue)
{
return [d1 compare:d2];
}
else
{
return [d2 compare:d1];
}
}];
return sortedArray;
}
设置setExistedArray == yourArray
根据您的要求将升序参数设置为是或否,对于升序,降序为no。
如何访问此功能
self.sortedArray = [[self sortedDateArrayWithExistedArray:self.yourArray Acending:NO] mutableCopy];
如果yourArray是可变的,则调用可变复制方法,否则不需要