2010-05-17 6 views
34

Ich habe ein Array von Objekten, und ich brauche sie nach ihrem "Titel" Schlüssel sortiert. Es funktioniert derzeit, obwohl es eine ASCII-Sortierung anstelle einer natürlichen Sortierung verwendet. Die Titel sind Dateinamen, so dass sie wie folgt aussehen:Wie mache ich eine natürliche Sortierung auf einem NSArray?

file1
file2
file3
...
Datei10
file11
file12

Ich erhalte, wie man erwarten würde:

Datei1
Datei10
file11
file12
file2
file3
...

Weiß jemand, ob es eine Möglichkeit, um die NSArray Sortier Funktionalität eingebaut, um diese natürliche Sortierung zu erhalten, wie die alphabetischen Sortierung dagegen? Ich fand einige generische Algorithmen, aber ich hoffte auf etwas eingebautes ...

+0

http://stackoverflow.com/a/9509181/1224741 – QED

Antwort

51

NSString s kann mit der NSNumericSearch vergleichen Option sein.

Eine Version:

NSInteger sort(Obj* a, Obj* b, void*) { 
    return [[a title] compare:[b title] options:NSNumericSearch]; 
} 

result = [array sortedArrayUsingFunction:&sort context:nil]; 

Oder ein bisschen mehr generic:

NSInteger sort(id a, id b, void* p) { 
    return [[a valueForKey:(NSString*)p] 
      compare:[b valueForKey:(NSString*)p] 
      options:NSNumericSearch]; 
} 

result = [array sortedArrayUsingFunction:&sort context:@"title"] 

Oder mit Blöcke:

result = [array sortedArrayUsingComparator:^(Obj* a, Obj* b) { 
    return [[a title] compare:[b title] options:NSNumericSearch]; 
}]; 
+2

Genau das, was ich gesucht habe! –

+0

super, sparen Sie viel Zeit – gbk

0

Dies funktioniert auf iOS

NSString *name0 = @"winter"; 
NSString *name1 = @"summer"; 
CFComparisonResult result = CFStringCompareWithOptions(
    (CFStringRef) name0, 
    (CFStringRef) name1, 
    CFRangeMake (0, CFStringGetLength((CFStringRef) name0)), 
    kCFCompareCaseInsensitive | kCFCompareLocalized | kCFCompareNumerically 
); 
4

Basierend auf @ PeterHosey Antwort, wenn Sie mit einer Reihe von String-Objekten arbeiten:

kurze Antwort:

NSArray *orderedTitles = [unorderedTitles sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 

VOLLES BEISPIEL:

NSArray *unorderedTitles = @[ 
    @"file12", 
    @"file1", 
    @"file10", 
    @"file3", 
    @"file2", 
    @"file11" 
]; 

NSArray *orderedTitles = [unorderedTitles sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 
NSLog(@"orderedTitles = %@", orderedTitles); 
/* 
orderedTitles = (
    file1, 
    file2, 
    file3, 
    file10, 
    file11, 
    file12 
) 
*/ 
0

Sie können tun, auch die Sortierung in der folgenden Art und Weise:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES selector:@selector(localizedStandardCompare:)]; 
NSArray *sortedItems = [unsortedItems sortedArrayUsingDescriptors:@[sortDescriptor]]; 
Verwandte Themen