1

私はiOSが初めてで、辞書アプリを構築しようとしています。私はNSMutableDictionary単語と定義の を持っており、その単語 (キー) を別NSArrayNSStringsと呼ばれるに保持していsortedWordsます。

sortedWords = [[NSMutableArray alloc] initWithArray:[[entries allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]];

ご覧のとおり、辞書で行う必要があるように、すべてのキーに対して大文字と小文字を区別しない比較を行っています。しかし、最近のデータベースの更新により、ダッシュで始まる単なる接尾辞である新しい単語が辞書に含まれていました。これらのエントリは、文字 A で始まるすべてのエントリに先行し、アルファベット順にリストされています。

私が達成したいのは、接尾辞も含めてすべてのエントリのアルファベット順を維持することですが、接尾辞をすべての文字の最初のエントリにすることです。たとえば、 の場合、Eエントリの順序は次のようになります。

-er
-est
each
eager
eagle

これどうやってするの?

4

4 に答える 4

1

独自のコンパレータを使用して並べ替えを要求できます。コンパレータは基本的に - プレフィックスを削除してから、両方の文字列を比較します。このようなもの:

[sortedWords sortUsingComparator:^(NSString *obj1, NSString *obj2) {

    NSString *temp1 = obj1;
    NSString *temp2 = obj2;
    if ([obj1 hasPrefix:@"-"])
         temp1 = [obj1 substringFromIndex:1];
    if ([obj2 hasPrefix:@"-"])
         temp2 = [obj2 substringFromIndex:1];

    return [temp1 caseInsensitiveCompare:temp2];
}];

私はこのコードをテストしませんでしたが、少なくともガイドとして役立つはずです!

于 2013-01-28T13:12:06.183 に答える
1

@manecostaの回答に感謝します。ただし、完全なソリューションはかなり複雑です。

#define hasDash hasPrefix:@"-"
// ...

NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@"-con", @"baby",
    @"context", @"zebra", @"-ar", @"-am", @"Big", @"chastity",
    @"-b", @"American", @"brute"]];

[arr sortUsingComparator:^NSComparisonResult(NSString *s1, NSString *s2) {
    if (![s1 hasDash] && ![s2 hasDash]) {
        return [s1 caseInsensitiveCompare:s2];
    } else if ([s1 hasDash] && [s2 hasDash]) {
        NSString *c1 = [s1 substringFromIndex:1];
        NSString *c2 = [s2 substringFromIndex:1];
        return [c1 caseInsensitiveCompare:c2];
    } else if ([s1 hasDash]) {
        NSString *c1 = [s1 substringFromIndex:1];
        if ([[[c1 substringToIndex:1] uppercaseString]
             isEqualToString:[[s2 substringToIndex:1] uppercaseString]]) {
            return NSOrderedAscending;
        } else {
            return [c1 caseInsensitiveCompare:s2];
        }
    } else { // if ([s2 hasDash]) {
        NSString *c2 = [s2 substringFromIndex:1];
        if ([[[s1 substringToIndex:1] uppercaseString]
             isEqualToString:[[c2 substringToIndex:1] uppercaseString]]) {
            return NSOrderedDescending;
        } else {
            return [s1 caseInsensitiveCompare:c2];
        }
    }
}];
于 2013-01-31T06:49:07.683 に答える
0

独自の比較関数を作成して、好きなように魔法をかけることができます

クラスのどこかに、この C++ のようなメソッドを追加します

NSInteger sortStrings(id value1, id value2, void *context); // This is just to avoid a warning when compiling the project :)

NSInteger sortStrings(id value1, id value2, void *context) {

    ... value1 and value2 will be NSStrings, compare them however you want ....

    returning -1 will mean value1 should come before
    returning 1 will mean value2 should come before
    returning 0 will mean they are equal and it won't matter which one is first

}

並べ替えを行うには、次のようにします。

[array sortUsingFunction:sortStrings context:nil];

編集

必要なものは何でも渡すことができ、環境変数などが必要な場合にcontext:備えて、オブジェクトの関数で利用できます。context

並べ替えを行う場合、配列も NSMutableArray である必要があります

于 2013-01-28T13:02:26.027 に答える
0

以下のコードを使用して、独自のアルゴリズムを実装して比較できます。

NSArray *sortedArray = [tempArray sortedArrayUsingComparator:^(id o1, id o2) {
            NSString *string1 = (NSString *)o1;
            NSString *string2 = (NSString *)o2;

            return [string1 compare:string2];
        }];
于 2013-01-28T13:09:07.487 に答える