のデータ コレクション( NSArray
)がありNSDictionary
ます。アプリでは、そのデータを 3 つの異なる並べ替え順序で表示する必要があります。ユーザーが並べ替えオプションを変更するたびにメモリを消費したり、メイン配列を再並べ替えしたりするため、3 つの異なる配列 (完全なデータを含む並べ替え順序ごとに 1 つ) を作成したくありません。だから今私の問題は、3つの異なるソート順で3つの異なる配列(または他のデータ型)のメイン配列のインデックスのみを取得できるメカニズムが欲しいということです。これを手動で行う必要がありますか、またはメイン配列からソートされたインデックス配列を取得するための組み込みメソッドがありますか?
5 に答える
あなたが求めていることは不可能です。アイテムを異なる配列に保存せずに、ソート方法が変わるたびにソートせずに、3 つの異なる順序でソートする必要があります。
無料で入手することはできません。メモリまたはパフォーマンスで支払うことができます。あなたが思っているほど高価ではないので、私は記憶に行きます。NSDictionaries へのポインタのみが配列に保持されるため、メモリをあまり消費しないはずです。
Step1 : 前に Enum 定義を宣言するimport statement
enum COMP_TYPE {
LOCALIZE_COMPARE = 1,
CASE_INSENSITIVE = 2,
LOCALIZE_CASE_INSENSITIVE = 3
};
.m
Step2 :ファイルに次の関数を定義します
-(NSArray *)sortArray:(NSArray *)arr WithType:(int)type andKey:(NSString *)key andOrder:(BOOL)order
{
SEL _compareSelector;
switch (type) {
case LOCALIZE_COMPARE:
_compareSelector = @selector(localizedCompare:);
break;
case CASE_INSENSITIVE:
_compareSelector = @selector(caseInsensitiveCompare:);
break;
case LOCALIZE_CASE_INSENSITIVE:
_compareSelector = @selector(localizedCaseInsensitiveCompare:);
break;
default:
break;
}
NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:order selector:_compareSelector];
return [arr sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
}
Step3 : 辞書の配列を宣言する
NSArray *myArr = [NSArray arrayWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"stack", @"name",
@"goa", @"name1",nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"stack", @"name",
@"goa", @"name1",nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"objective", @"name",
@"c++", @"name1",nil], nil];
Step4 : 異なるパラメータで関数を呼び出す
NSLog(@"%@",[self sortArray:myArr WithType:LOCALIZE_COMPARE andKey:@"name" andOrder:YES]);
NSLog(@"%@",[self sortArray:myArr WithType:CASE_INSENSITIVE andKey:@"name" andOrder:YES]);
NSLog(@"%@",[self sortArray:myArr WithType:LOCALIZE_CASE_INSENSITIVE andKey:@"name" andOrder:YES]);
データを単一の配列に保持したい場合はNSMutableArray
、並べ替え基準が変更されるたびに and (re-)sort を使用できます。
ただし、これは、データ配列がモデルの一部であり、並べ替え順序がプレゼンテーション (UI) の問題である場合、モデル、ビュー、およびコントローラーの機能を 1 つのオブジェクトに効果的に混在させることを意味することに注意してください。悪い ( :-) ) しかし、歴史上初めてのことではありません。
以下は、辞書のキーに直接ソート記述子を使用する例です。
NSMutableArray *data = // ... your data as a mutable array
NSString* sortKey = // ... one of the 3 dictionary keys that you wish to sort by
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:sortKey ascending:YES];
[data sortUsingDescriptors:@[sd]];
配列は、追加のdata
配列変数を使用せずにソートされるようになりました。
同じ配列を異なる順序でソートすることはできません。
並べ替える前に毎回配列を保存する必要があります。