2011-09-20 7 views
11

私はオブジェクトの配列を持っていますので、評価で並べ替える必要があります(2つの5つの星の要素を比較すると、最も多くの票を持つものが最初になるはずです)複数の並べ替え記述子を設定する

NSArrayを2つのディスクリプタでソートすることはできますか?

私はsortUsingDescriptors:ようhttp://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

何かに見つけたが、私は、ドキュメント内のどこにでもそれを見つけることは非推奨と思うことはできません。

答えて

29

はい、できます:

NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO]; 
NSSortDescriptor *sortVotes = [[NSSortDescriptor alloc] initWithKey:@"votes" ascending:NO]; 

NSArray *sortedArray = [orignalAray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating, sortVotes, nil]]; 
[sortRating release], sortRating = nil; 
[sortVotes release], sortVotes = nil; 
1

あなたは基本的に正しいです。 NSArrayには、

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

のメソッドがあります。これにより、新しい配列が返され、さまざまな記述子に従ってソートされます。

- (void)sortUsingDescriptors:(NSArray *)sortDescriptors 

は存在しませんが、あなたがたNSArrayのドキュメントでそれを見つけることができなかった理由を説明するかもしれないNSMutableArrayの、上にあります。同じ目標を達成しますが、新しい配列を返すのではなく、呼び出す配列をソートします。どちらも推奨されていません。

0

使用- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors。ここではドキュメントは次のとおりです。NSArrayClass Reference

例えば:

NSSortDescriptor *sortRating = nil; 
NSSortDescriptor *sortDate = nil; 

NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO]; 
NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO]; 
NSArray *sortedArray = [auxArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating,sortDate,nil]]; 

[sortRating release]; 
sortRating = nil; 

[sortDate release]; 
sortDate = nil; 

乾杯!

+0

あなたのコードがコンパイルされません、あなたはまだ、コンパイルされませんsortRatingとsortDate – rckoenes

+0

をリークしています。コンパイルされない理由は、 'sortRating'と' sortDate'という変数名で再定義されているからです。また、定義されていない 'sortDescriptor'というオブジェクトを解放しています。あなたは' sortRating'と 'sortDate'を解放しません。 – rckoenes

1

ここには1つのライナーがあります。

NSArray *sortedArray = [unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor [email protected]"rating" ascending:NO], [NSSortDescriptor [email protected]"date" ascending:NO], nil]]; 
0

あなたは1にNSArrayを使用している場合は、この1:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"x_date" ascending:TRUE]; 
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"x_time" ascending:TRUE]; 
[tempArray sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,sortDescriptor1, nil]]; 
関連する問題