web-dev-qa-db-ja.com

日付文字列またはオブジェクトのNSArrayを並べ替える

日付文字列を含むNSArrayを持っています(i.e。NSString)次のように: "Thu、21 May 09 19:10:09 -0700"

NSArrayを日付で並べ替える必要があります。最初に日付文字列をNSDateオブジェクトに変換することを考えましたが、NSDateオブジェクトでソートする方法にこだわっています。

ありがとう。

83
postalservice14

NS(Mutable)ArrayにNSDateオブジェクトとして日付を保存し、 _-[NSArray sortedArrayUsingSelector:_ または _-[NSMutableArray sortUsingSelector:]_ を使用して@selector(compare:)パラメーターとして。 _-[NSDate compare:]_ メソッドは、日付を昇順で並べます。これはNSSortDescriptorを作成するよりも簡単で、独自の比較関数を書くよりもはるかに簡単です。 (NSDateオブジェクトは、少なくともカスタムコードで達成できると期待されるほど効率的に互いに比較する方法を知っています。)

109
Quinn Taylor

タイプNSMutableArrayのフィールド「beginDate」を持つオブジェクトのNSDateがある場合、以下のようにNSSortDescriptorを使用しています。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
113
vinzenzweber

次のようなものも使用できます。

//Sort the array of items by  date
    [self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
        return [obj2.date compare:obj1.date];
    }];

ただし、これは日付がNSDateではなくNStringとして保存されていると仮定しています。これは作成/実行に問題はないはずです。できれば、生の形式でデータを保存することもお勧めします。このような状況で操作しやすくします。

16
TheCodingArt

ブロックを使用して所定の場所に並べ替えることができます。

sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) {
    NSDate *d1 = [NSDate dateWithString: s1];
    NSDate *d2 = [NSDate dateWithString: s2];
    return [d1 compare: d2];
}];

ソートする前にすべての文字列を日付に変換して、日付項目よりも多く変換しないようにすることをお勧めします。並べ替えアルゴリズムは、配列内のアイテムの数よりも多くの文字列から日付への変換を提供します(大幅に多い場合があります)

ブロックの並べ替えについてもう少し: http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html

私の場合、それは次のように機能しました:

    NSArray * aUnsorted = [dataToDb allKeys]; 
 NSArray * arrKeys = [aUnsorted sortArrayUsingComparator:^ NSComparisonResult(id obj1、id obj2){
 NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
 [df setDateFormat:@ "dd-MM-yyyy"]; 
 NSDate * d1 = [df dateFromString:(NSString *)obj1]; 
 NSDate * d2 = [df dateFromString :(NSString *)obj2]; 
 return [d1 compare:d2]; 
;

すべてのキーがdd-MM-yyyy形式の日付である辞書がありました。また、allKeysは辞書キーを並べ替えずに返します。データを時系列で表示したかったのです。

sortedArrayUsingFunction:context: 。サンプルを次に示します。

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
    NSDate *d1 = [NSDate dateWithString:s1];
    NSDate *d2 = [NSDate dateWithString:s2];
    return [d1 compare:d2];
}

NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];

NSMutableArrayを使用する場合、 sortArrayUsingFunction:context: 代わりに。

5
notnoop

NSDateを取得したら、initWithKey:ascending:NSSortDescriptorを作成し、sortedArrayUsingDescriptors:を使用してソートを実行できます。

4
smorgan

Swift 3.

myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
1
Abhishek Jain

これを変える

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

キーを変更するだけです:常にDateでなければなりません

1
user2339385