0

私は

NSArray *foo = @[@"Chicago Hts, IL", @"Chicago Heights, IL", @"Chicago, IL"];

このようなソートされた配列を取得したい:

@[@"Chicago, IL", @"Chicago Heights, IL", @"Chicago Hts, IL"];

使った

[foo sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:),

その結果、

@[@"Chicago Heights, IL", @"Chicago Hts, IL", @"Chicago, IL"];

この配列には約100k以上のエントリがあるため、空のスペースに基づいて文字列を分割し、それを並べ替えて「分割解除」すると、パフォーマンスが低下します。

Finderが「localizedCaseInsensitiveCompare」と同じ方法でファイルをソートすることに気付いたので、運が悪かったと思います。

私は最初の文字「a」に基づいて配列を分割し、空のスペースに基づいて文字列を結合し、それを並べ替えてから、tableViewでユーザーに表示し、ユーザーが最初の結果セットを超えてスクロールした場合、 'b'の次のオブジェクトのセットを取得し、空のスペースを無視して単語を結合し、並べ替え、'単語の結合を解除して'表示します。

4

1 に答える 1

1

独自のコンパレータを提供します。

NSArray *sorted = [foo sortedArrayUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
    // Remove all spaces
    NSString *s1 = [str1 stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *s2 = [str2 stringByReplacingOccurrencesOfString:@" " withString:@""];

    return [s1 localizedCaseInsensitiveCompare:s2];
}];
于 2013-03-27T04:03:26.263 に答える