2011-07-27 3 views
9

私は(名前)ソートにNSArrayをソート

と私はiphoneのアドレス帳がそれらをソートする方法のようにそれらを並べ替えたい文字列の配列を持っている

  • 例えば: ELI - > Eの下
  • 例:ALI - >下
  • 例:4li - >#

任意の提案の下で?

答えて

11

文字列に対して区別して区別しない比較を実行する必要があります。 NSStringは、NSDiacriticInsensitiveSearchというオプションのcompare:options:メソッドを持っています。

NSArray *array = [NSArray arrayWithObjects:@"éli", @"bob", @"earl", @"allen", @"àli", @"aaron", nil]; 

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; 
}]; 

編集:

はここで意志セクションの最初の文字に基づいて結果分音小文字を区別しない完全な例です。私はあなたが正しく表示するためにあなた自身のソートされたキーを追跡する必要があるので、辞書を入れた。

NSArray *array = [NSArray arrayWithObjects:@"éli", @"bob", @"earl", @"allen", @"àli", nil]; 

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch]; 
}]; 

NSMutableDictionary *sectioned = [NSMutableDictionary dictionary]; 
NSString *firstChar = nil; 

for(NSString *str in sorted) 
{ 
    //Ignore empty strings 
    if(![str length])continue; 

    NSMutableArray *names = nil; 

    //Compare the first character using diacritic insensitive search 
    if([str compare:firstChar options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, 1)] == NSOrderedSame) 
    { 
     names = [sectioned objectForKey:firstChar]; 
    } 
    else 
    { 
     //decomposedStringWithCanonicalMapping is where the magic happens 
     //(it removes the accent mark) 
     firstChar = [[str decomposedStringWithCanonicalMapping] substringToIndex:1]; 
     names = [NSMutableArray array]; 
     [sectioned setObject:names forKey:firstChar]; 
    } 

    [names addObject:str]; 
} 

NSLog(@"sorted: %@", sorted); 
//This is sectioned like the address app 
NSLog(@"sectioned: %@", sectioned); 
+0

"name"というプロパティを持つカスタムオブジェクトの配列に対してもこれを行うことは可能ですか? –

+0

はい、NSStringとしてobj1をキャストするのではなく、比較の中にカスタムオブジェクトとしてキャストし、 NSString * strを独自の型に変更して、単にnameプロパティですべての比較を行います。 – Joe

1

すべてはあなたのソート方法のセレクタとして使用し、より重要なのNSDiacriticInsensitiveSearchオプションとなりますcompare:方法の範囲内にあります。

[[yourArray] sortedArrayUsingSelector:@selector(compareTheAddressBookWay:)]; 

は今、あなたは、カテゴリ

@implementation NSString (YourCategory) 

- (NSComparisonResult) compareTheAddressBookWay:(NSString*)iString 
{ 
    return [self compare:iString 
       options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch 
        range:NSRangeFromString(self) 
} 

@end 

compareTheAddressBookWay:メソッドを追加する必要があります!!重要!!:sortedArrayUsingSelector:を使用して

は2.0
しばらくまでのiOS用対応となりますsortedArrayUsingComparator:を使用するとのみ iOS 4以上で動作します。