0

sort メソッドの結果をソートできるようにする必要がありますが、その方法がわかりません。前の結果に対してシミュレート メソッドを再度実行する必要がありますか、それとも 1 つのメソッドで実行できますか?

これが私の方法です

-(NSArray*)getGameTemplateObjectOfType:(NSString *) type
{
    NSArray *sortedArray;    

    if(editorMode == YES)
    {
        sortedArray = kingdomTemplateObjects;
    }
    else
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type CONTAINS[cd] %@", type];

        NSArray *newArray = [kingdomTemplateObjects filteredArrayUsingPredicate:predicate];

        NSSortDescriptor *sortDescriptor;
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:type
                                                     ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

        sortedArray = [newArray sortedArrayUsingDescriptors:sortDescriptors];

    }


    return sortedArray;
}

type が "Building" に設定され、ゲーム内のすべての建物の種類が返されますが、それらの結果を名前に従ってアルファベット順に並べ替えたい場合はどうすればよいでしょうか? または、金の価値からどの建物が最も高価であるかによってソートされますか?

4

2 に答える 2

1

あなたのコードで、 if [kingdomTemplateObjectsfilteredArrayUsingPredicate:predicate]; 正しい結果を返します

[newArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];次に、配列をソートするために使用でき ます。

    -(NSArray*)getGameTemplateObjectOfType:(NSString *) type
    {
        NSArray *sortedArray;    

        if(editorMode == YES)
        {
            sortedArray = kingdomTemplateObjects;
        }
        else
        {
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type CONTAINS[cd] %@", type];
            NSArray *newArray = [kingdomTemplateObjects filteredArrayUsingPredicate:predicate];
            sortedArray = [newArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
        }


        return sortedArray;
    }
于 2013-04-27T14:42:53.427 に答える
1

配列を 2 回解析する必要があります。NSPredicate はソートする手段を提供しません。NSPredicate プログラミング ガイドを参照してください。私が実際に行ったことは、NSPredicate BNF 構文をすばやくスキャンして、ASC や DESC などの並べ替え演算子の明らかな兆候を探すことでした。そこには何もありません。

また、SOについても同様の質問がいくつかあります。

getGameTemplateObjectOfType: 結果をどのようにソートしたいかを伝えるために、ソート用のキーを渡すことができます。例えば:

-(NSArray *)getGameTemplateObjectOfType:(NSString *)type sortedByKey:(NSString *)key ascending:(BOOL)ascending;

ただし、そうするとコードが複雑になる可能性があります。関数内でキーと型のすべての組み合わせを処理する必要があります。(ここで言っていることがわからない場合はお知らせください)。

getGameTemplateObjectOfType:最終的には、フィルタリング機能を単にフィルタリングに任せることになるかもしれません。そして、その関数のクライアントが結果を何らかの方法でソートしたい場合、クライアントはそうすることができます。そして、Apple が機能を分離したままにしている理由がわかります。

于 2013-04-27T14:44:08.067 に答える