日付文字列またはオブジェクトの NSArray をソートする
-
16-09-2019 - |
質問
を持っています NSArray
日付文字列が含まれている (すなわち、NSString) このような:「木、09 年 5 月 21 日 19:10:09 -0700」
並べ替える必要があります NSArray
日付ごとに。日付文字列を次の形式に変換することを考えました。 NSDate
最初にオブジェクトを作成しましたが、そこでソートする方法で行き詰まってしまいました。 NSDate
物体。
ありがとう。
解決
日付を次のように保存します NSDate
NS(Mutable)Array 内のオブジェクトを使用する場合は、 -[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 sortedArrayUsingComparator:^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
, を作成できます。 NSSortDescriptor
と initWithKey:ascending:
そして使用します sortedArrayUsingDescriptors:
仕分けをするために。
これを変える
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
いつも
スイフト3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })