少し問題があります。10個のNSMutableArrayを含むNSMutableDictionaryがあります。各配列には0〜10の数値があり、それぞれが任意の整数(12や103など)になります。
私がする必要があるのは、各アレイ全体から上位10個の最大数を取得することです。問題は、それが由来する配列の参照(キー)と、それが形成された配列からの数値のインデックス位置を保持する必要があることです。
少し問題があります。10個のNSMutableArrayを含むNSMutableDictionaryがあります。各配列には0〜10の数値があり、それぞれが任意の整数(12や103など)になります。
私がする必要があるのは、各アレイ全体から上位10個の最大数を取得することです。問題は、それが由来する配列の参照(キー)と、それが形成された配列からの数値のインデックス位置を保持する必要があることです。
最も簡単な方法は、配列を降順で並べ替えてから、最初の10個のインデックスを取得することです。
または、辞書内にある場合は、辞書を繰り返し、allValues
すべての配列を取得し、共通の配列内にすべての要素を追加して、それを並べ替えます
最終的に必要なデータ構造はオブジェクトの配列であるように見えます。各オブジェクトは、文字列(キー)と値(オフセット)で構成されていることを除けば、機能的には「インデックスパス」に似ています。
最大数の実際の検索に問題がないと仮定すると、候補番号が見つかったら、これらのオブジェクトの1つを作成して、上位10個が見つかったら、オブジェクトをバックポインターとして使用できるようにすることをお勧めします。番号のソースの場所。
'C'ロジックを使用して、配列を降順で短絡する必要があります。ここでは、あなたの状態に応じた例を示します。
// adding 20 elements in an array, suppose this is your original array (array1).
NSMutableArray *array1 = [[NSMutableArray alloc]init];
for(int i=0;i<20;i++)
{
NSString *str = [NSString stringWithFormat:@"%d",(i*4)];
[array1 addObject:str];
}
//make a copy of your original array
NSMutableArray *array2 = [[NSMutableArray alloc]initWithArray:array1];
// this is the array which will get your sorting list
NSMutableArray *array3 = [[NSMutableArray alloc]init];
//declare an integer for compare as a maximum number and it to 0 initially
int max = 0;
// this is the logic to sort an array
for(int i=0;i<20;i++)
{
for(int j=0;j<[array2 count];j++)
{
int f = [[array2 objectAtIndex:j] intValue];
if(max<f)
{
max = f;
}
}
NSString *str = [[NSNumber numberWithInt:max]stringValue];
//max has a maximum value then add it to array3 and remove from array2
//for a new shorting
[array3 addObject:str];
[array2 removeObject:str];
// set 0 to max again
max = 0;
}
//now after all procedure print the **array3**
// and you will get all the objects in descending order,
//you can take top **10** variables from **array3**
NSLog(@"your sorting array %@", **array3**);
}
ある種の宿題のように聞こえます:)
だからあなたはこれを持っています:
NSMutableDictionary* source = [@{
@"1" : @[ @10, @20, @100 … ],
@"2" : @[ @8, @42, @17 … ]
} mutableCopy];
それでは、別のアレンジメントを作成することから始めましょう。
NSMutableArray* numbers = [NSMutableArray new];
for (NSArray* array in source.allValues)
{
for (NSNumber* number in array)
{
[numbers addObject: @{ @"number" : number, @"parent" : array }];
}
}
これが私たちが得るものです:
@[
@{ @"number" : @10, @"parent" : <array> },
@{ @"number" : @20, @"parent" : <array> },
…
]
これで、必要な番号を並べ替えて見つけることができます。
[numbers sortUsingComparator: ^( id lhs, id rhs ){
return [((NSDictionary*) rhs)[@"number"] compare: ((NSDictionary*) lhs)[@"number"]];
}];
NSArray* topNumbers = [numbers subarrayWithRange: NSMakeRange( 0, 10 )];
これが私たちです。topNumbersには、ソース配列に沿って必要な番号が含まれています。
これは非常に素朴な方法です。CPU時間とメモリ使用量の両方をかなりの量で最適化できます。しかしねえ、それをシンプルに保つことは悪いことではありません。
対処されていません:10番目と11番目の数字が等しい場合はどうなりますか?(ここで対処:配列から特定の番号を選択しますか?)範囲チェック。テストもコンパイルもされていません。;)
数値の「キー」値と要素への「パス」(配列インデックス)で構成される、各要素のオブジェクト/構造を作成する配列をウォークスルーします。そのように作成されたオブジェクト/構造を並べ替えます。(これは「タグソート」と呼ばれます。)
もう1つのアプローチは、上位N個の値(N <<エントリの総数)のみが必要な場合、上記のキーとパス情報で構成されるN個の要素の配列を作成することです。すべての配列をスキャンし、各配列要素を現在保存されているNの最小のキーと比較します。保存されている最小の要素よりも大きい要素を見つけた場合は、保存されている最小の要素を置き換え、N個の要素を並べ替えて、保存されている新しい最小の要素を選択します。