私は(名前)ソートにNSArrayをソート
と私はiphoneのアドレス帳がそれらをソートする方法のようにそれらを並べ替えたい文字列の配列を持っている
- 例えば: ELI - > Eの下
- 例:ALI - >下
- 例:4li - >#
任意の提案の下で?
私は(名前)ソートにNSArrayをソート
と私はiphoneのアドレス帳がそれらをソートする方法のようにそれらを並べ替えたい文字列の配列を持っている
任意の提案の下で?
文字列に対して区別して区別しない比較を実行する必要があります。 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);
すべてはあなたのソート方法のセレクタとして使用し、より重要なの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以上で動作します。
"name"というプロパティを持つカスタムオブジェクトの配列に対してもこれを行うことは可能ですか? –
はい、NSStringとしてobj1をキャストするのではなく、比較の中にカスタムオブジェクトとしてキャストし、 NSString * strを独自の型に変更して、単にnameプロパティですべての比較を行います。 – Joe