-1

私は日付の配列を持っています。これらの日付はすべて NSString オブジェクトです。今、それらを並べ替えたいと思います。これは私の機能がどのように見えるかです。

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"dd-MM-YYYY"];

    NSString *date1 = [NSString stringWithFormat:@"%@",s1];
    NSString *date2 = [NSString stringWithFormat:@"%@",s2];

    NSDate *v1 = [df dateFromString: date1];
    NSDate *v2 = [df dateFromString: date2];
   return [v1 compare:v2];

}

そして、私はこのように関数を呼び出します。

NSArray *sortedKeys = [unsortedKeys sortedArrayUsingFunction:dateSort context:nil];

これが結果です

sorted keys are (
    "24-10-2013",
    "28-06-2013",
    "03-10-2013",
    "20-12-2013",
    "04-09-2013",
    "19-09-2013",
    "07-07-2013",
    "15-09-2013",
    "01-07-2013",
    "04-11-2013",
    "27-06-2013",
    "02-10-2013",
    "05-08-2013",
    "17-10-2013",
    "04-10-2013"
)

これは正しい順序ではありません。降順にしてください。

誰でもこれで私を助けることができますか?

4

1 に答える 1

3

いくつかの問題があります。

  • 正しい日付形式は"dd-MM-yyyy".
  • 昇順ではなく降順で日付を並べ替えるには、単に置き換えます

    return [v1 compare:v2];
    

    return [v2 compare:v1];
    
  • stringWithFormat呼び出しは完全に不要です (@rmaddy のコメントによる) 。

  • 日付フォーマッタの作成はコストのかかる操作と見なされ、一度だけ実行する必要があります。

以上で、compare メソッドは次のようになります。

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
    static NSDateFormatter *df;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"dd-MM-yyyy"];
    });

    NSDate *v1 = [df dateFromString: s1];
    NSDate *v2 = [df dateFromString: s2];
    return [v2 compare:v1];
}
于 2013-07-31T07:11:11.963 に答える