4

NSString我有一个格式的对象数组......@"Aug 2013" @"July 2013" and so on...

我想在ascending order..中对这个数组进行排序。首先获取日期以获得个人价值是个好主意..?

4

7 回答 7

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];
}];
于 2013-09-02T13:11:23.373 回答
3

我看到您更喜欢“字符串”(不是拼写错误)类型的变量。他们经常最终给你这样的错误。您真正应该做的是将日期存储为日期。它们可以很好地相互比较,您可以用它们进行精美的日期计算。数字也是如此。

然后,如果您想在用户界面中将它们显示为“Aug 2013”​​或“July 2013”​​:使用日期格式化程序将日期格式化为仅用于显示的适当字符串。


对于这种情况,您应该查看(阅读文档等)的两个主要类是:NSDateNSDateFormatter. NSCalendar并且NSDateComponents也应该被证明是有用的。

于 2013-09-02T12:48:57.077 回答
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];

    }
于 2013-09-02T13:01:25.470 回答
2

我会改用对象并在需要的地方格式化它的内容NSArrayNSDate

于 2013-09-02T12:53:34.957 回答
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
}

我希望,它可以帮助你。

于 2013-09-02T13:03:42.387 回答
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);

}
于 2013-09-02T13:08:45.500 回答
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 设置升序参数设置为是或否,对于升序,否对于降序。

如何访问此功能

self.sortedArray = [[self sortedDateArrayWithExistedArray:self.yourArray Acending:NO] mutableCopy];

如果 yourArray 是可变的,则调用可变复制方法,否则不需要

于 2015-06-19T11:53:37.413 回答