次のようなNSArray
日付文字列(つまりNSString)を含むがあります: "Thu、21 May 09 19:10:09 -0700"
NSArray
日付で並べ替える必要があります。NSDate
最初に日付文字列をオブジェクトに変換することを考えましたが、NSDate
オブジェクトで並べ替える方法に行き詰まりました。
ありがとう。
次のようなNSArray
日付文字列(つまりNSString)を含むがあります: "Thu、21 May 09 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];
-[NSMutableArray sortUsingComparator:]
(10.6+)を使用-compare:
して、2つのフィールドの呼び出し結果を返すブロックを渡すこともできます。おそらく-valueForKey:
、各オブジェクトを呼び出すよりも高速です。-sortWithOptions:usingComparator:
オプションを使用して渡すことで、同時に並べ替えることもできます。
次のようなものを使用することもできます。
//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 = [aUnsortedsortedArrayUsingComparator:^ 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
オブジェクトが含まれている場合は、上記の私の答えを使用するか-[NSMutableArray sortUsingComparator:]
、10.6で追加されたを使用することもできます。
を取得したらNSDate
、NSSortDescriptor
withinitWithKey:ascending:
を作成し、を使用sortedArrayUsingDescriptors:
して並べ替えを行うことができます。
Swift 3.0
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
常にキーを変更する必要があります。