日付文字列を含むNSArray
を持っています(i.e。NSString)次のように: "Thu、21 May 09 19:10:09 -0700"
NSArray
を日付で並べ替える必要があります。最初に日付文字列をNSDate
オブジェクトに変換することを考えましたが、NSDate
オブジェクトでソートする方法にこだわっています。
ありがとう。
NS(Mutable)ArrayにNSDate
オブジェクトとして日付を保存し、 _-[NSArray sortedArrayUsingSelector:
_ または _-[NSMutableArray sortUsingSelector:]
_ を使用して@selector(compare:)
パラメーターとして。 _-[NSDate compare:]
_ メソッドは、日付を昇順で並べます。これはNSSortDescriptor
を作成するよりも簡単で、独自の比較関数を書くよりもはるかに簡単です。 (NSDate
オブジェクトは、少なくともカスタムコードで達成できると期待されるほど効率的に互いに比較する方法を知っています。)
タイプNSMutableArray
のフィールド「beginDate」を持つオブジェクトのNSDate
がある場合、以下のようにNSSortDescriptor
を使用しています。
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
次のようなものも使用できます。
//Sort the array of items by date
[self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj2.date compare:obj1.date];
}];
ただし、これは日付がNSDate
ではなくNString
として保存されていると仮定しています。これは作成/実行に問題はないはずです。できれば、生の形式でデータを保存することもお勧めします。このような状況で操作しやすくします。
ブロックを使用して所定の場所に並べ替えることができます。
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:
代わりに。
NSDate
を取得したら、initWithKey:ascending:
でNSSortDescriptor
を作成し、sortedArrayUsingDescriptors:
を使用してソートを実行できます。
Swift 3.
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
これを変える
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
でなければなりません