如何按日期格式@“2013年8月”按升序排序NSArray字符串..?

时间:2013-09-02 12:43:03

标签: iphone ios objective-c sorting

我有一组格式为NSString

@"Aug 2013" @"July 2013" and so on...个对象

我想在ascending order中对这个数组进行排序。首先将个别值的日期作为一个好主意..?

7 个答案:

答案 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月”:使用日期格式化程序将日期格式化为仅显示的相应字符串。


对于这种情况,您应该查看的两个主要类(阅读文档等)是:NSDateNSDateFormatterNSCalendarNSDateComponents也应该有用。

答案 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)

我会使用NSArrayNSDate个对象,并根据需要格式化它的内容。

答案 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是可变的,则调用可变复制方法,否则不需要