2

次の文字列を含む文字列の配列を取得します。文字列には特定のパターンがあります

str1 str51 str3 str4 str10 str39 str31 str191

すべての文字列は「str」で始まり、末尾に数字が追加されます。

値の順に文字列を一覧表示するように配列を並べ替える適切な方法はありますか

str1 str3 str4 str10 str31 str39 str51 str191

再帰関数を書くことでそれを行う方法を見ることができます

NSString * firstString = [[strArray objectAtIndex:i].substringFromIndex:3];
NSString * secondString = [[strArray objectAtIndex:i+1].substringFromIndex:3];

if ([firstString intValue] < [secondString intValue])
{
    //do nothing they order is correct
}
else
{
    //swap the order of the 2 strings in the array
}

しかし、それは非常に初歩的なコードです。Objective-Cには、この並べ替えをより適切に処理するためのメカニズムや優れたコードトリックがありますか?

どうもありがとう、-コード

4

6 に答える 6

6

それらがすべて同じプレフィックスで始まる場合、デフォルトのソートで適切に処理されると思います。つまり、次のようになります。

[someArray sortUsingSelector:@selector(compare:)];

何らかの理由でこれが機能しない場合は、ブロックを使用できます。これを試して:

NSArray *sortedArray = [someArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
{
    //Default compare, to protect against cast
    if (![a isKindOfClass:[NSString class]] || ![b isKindOfClass:[NSString class]]) {
        return ([a compare:b]);
    }
    else {
        NSString *aString = (NSString*) a;
        NSString *bString = (NSString*) b;
        int aInt = [[a.substringFromIndex:3] intValue];
        int bInt = [[b.substringFromIndex:3] intValue];
        return [aInt < bInt];
    }
}];
于 2012-07-27T09:30:58.163 に答える
2

このように並べ替えることができます

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString * str1 = [(NSString *)obj1 substringFromIndex:3];
    NSString * str2 = [(NSString *)obj2 substringFromIndex:3];
    return [str1 compare:str2 options:NSNumericSearch];
}];
于 2012-07-27T09:35:41.150 に答える
0

必要な動作でコンパレータ関数を定義できます。以下の例では、大文字と小文字を区別せず、文字列の末尾にある数字を尊重して、MacOSでのFinderの動作をエミュレートします。ただし、順序は提供されたロケールに依存するため、結果を完全に一貫させたい場合は、ロケールを選択してハードコーディングする必要があります。

int finderSortWithLocale(id string1, id string2, void *locale)
{
    static NSStringCompareOptions comparisonOptions =
        NSCaseInsensitiveSearch | NSNumericSearch |
        NSWidthInsensitiveSearch | NSForcedOrderingSearch;

    NSRange string1Range = NSMakeRange(0, [string1 length]);

    return [string1 compare:string2
                    options:comparisonOptions
                    range:string1Range
                    locale:(__bridge NSLocale *)locale];
}

探していることを確実に実行するために、これらの各オプションのドキュメントを必ず読んでください。

このようなコンパレータを使用して文字列配列を効率的にソートするには、次のsortedArrayUsingFunction:context:方法を使用します。

NSArray *sortedArray = [stringsArray sortedArrayUsingFunction:finderSortWithLocale context:(__bridge void *)[NSLocale currentLocale]];
于 2012-07-27T09:29:36.963 に答える
0

NSSortDescriptorを作成し、キー「description」で配列を並べ替えます。このような:

NSMutableArray *array = [NSMutableArray arrayWithCapacity:0]; //Your Array of NSStrings
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
array = [array sortedArrayUsingDescriptors:@[descriptor]];
于 2014-03-07T11:42:04.520 に答える
0
NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"datetime"
                                                             ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
NSArray *sortedArray = [myArrayNonsort sortedArrayUsingDescriptors:sortDescriptors];
于 2014-09-01T06:37:08.513 に答える
-1

sortedArray = [anArraysortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare :)];

input:anArray output:sortedArray

ドキュメントを参照してください

于 2012-07-27T09:31:48.397 に答える