NSString
我有一个格式的对象数组......@"Aug 2013" @"July 2013" and so on...
我想在ascending order
..中对这个数组进行排序。首先获取日期以获得个人价值是个好主意..?
NSString
我有一个格式的对象数组......@"Aug 2013" @"July 2013" and so on...
我想在ascending order
..中对这个数组进行排序。首先获取日期以获得个人价值是个好主意..?
一个块中的另一种解决方案
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];
}];
我看到您更喜欢“字符串”(不是拼写错误)类型的变量。他们经常最终给你这样的错误。您真正应该做的是将日期存储为日期。它们可以很好地相互比较,您可以用它们进行精美的日期计算。数字也是如此。
然后,如果您想在用户界面中将它们显示为“Aug 2013”或“July 2013”:使用日期格式化程序将日期格式化为仅用于显示的适当字符串。
对于这种情况,您应该查看(阅读文档等)的两个主要类是:NSDate
和NSDateFormatter
. NSCalendar
并且NSDateComponents
也应该被证明是有用的。
我通过使用类别在 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];
}
我会改用对象并在需要的地方格式化它的内容NSArray
。NSDate
您可以通过实现以下代码对数组进行排序。
-(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
}
我希望,它可以帮助你。
尝试这个
- (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);
}
- (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
设置升序参数设置为是或否,对于升序,否对于降序。
如何访问此功能
self.sortedArray = [[self sortedDateArrayWithExistedArray:self.yourArray Acending:NO] mutableCopy];
如果 yourArray 是可变的,则调用可变复制方法,否则不需要