2012-03-28 10 views
7

Ich baue eine Anwendung in xcode4.3/Objective-C und bin auf ein Problem gestoßen, als ich versuchte, ein NSMutableArray zu sortieren. Ich werde es mit Strings aus einer SQLite-Datenbank füllen. Das Problem tritt bei den schwedischen Zeichen å, ä und ö auf.Wie kann ich ein Array von Strings alphabetisch sortieren, wenn die Strings åäö enthalten?

Das sortierte Array sollte in etwa so aussehen: as, br, ol, st, år, ög, ös.

Aber wenn ich den Selektor verwenden, vergleichen Sie die Reihenfolge ist dies: wie, år, br, ol, ög, ös, st.

Und wenn ich localizedCompare verwenden, ändern sich die Reihenfolge zu: as, år, br, ög, ol, ös, st.

Nach älteren Threads sollte das lokalisierte Compare die Lösung sein, aber ich kann es nicht richtig funktionieren lassen. Wenn ich mit dem Terminal auf die SQLite-Datenbank zugreife und ORDER schreibe, bekomme ich das korrekte Ergebnis. Könnte mein Problem mit einigen Einstellungen in xcode oder dem iPhone-Simulator zusammenhängen, da beide nicht die richtige Reihenfolge anzeigen? Oder ist locatedCompare der falsche Weg? Ich werde jede Art von Problemumgehung akzeptieren, solange es den Job erledigt. Vielen Dank.

+0

Können Sie den Code, die Sie dies erreichen? – David

+0

Ich würde prüfen, ob 'localizedStandardCompare:' anders ist. Andernfalls müssen Sie möglicherweise Ihren eigenen Vergleicher implementieren (oder Sie erwähnen eine SQLite-DB ... wenn Sie Core Data verwenden, können Sie die Datenbank sortieren lassen, indem Sie Sortierdeskriptoren für eine Abrufanforderung festlegen). – rickster

+0

lokalisierter Vergleich sollte funktionieren, aber nur, wenn Ihr Gebietsschema (auf Ihrem Computer) auf Schweden eingestellt ist. Das komische Ding, das ich bekomme, ist, wenn ich das Array logge die Wörter mit Sonderzeichen nicht drucken, aber als Unicode-Codes angezeigt werden. Wenn ich die einzelnen Wörter logge, loggen sie sich korrekt und in der richtigen Reihenfolge ein. – rdelmar

Antwort

13

Sie können es mithilfe compare:options:range:locale: und Angabe schwedischen Gebietsschema explizit, wie dies funktioniert:

NSArray *strings=[NSArray arrayWithObjects:@"as", @"ol", @"st", @"br", @"ög", @"år", @"ös", nil]; 
NSLocale *locale=[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"]; 

NSArray *sorted=[strings sortedArrayUsingComparator:^(NSString *first, NSString *second) { 
    return [first compare:second 
        options:0 
        range:NSMakeRange(0, [first length]) 
        locale:locale]; 
}]; 

for (NSString *s in sorted) { NSLog(@"%@", s); } 

Die Ausgabe lautet:

2012-04-10 08:08:18.139 Untitled[32416:707] as 
2012-04-10 08:08:18.140 Untitled[32416:707] br 
2012-04-10 08:08:18.141 Untitled[32416:707] ol 
2012-04-10 08:08:18.142 Untitled[32416:707] st 
2012-04-10 08:08:18.142 Untitled[32416:707] år 
2012-04-10 08:08:18.143 Untitled[32416:707] ög 
2012-04-10 08:08:18.143 Untitled[32416:707] ös 
Verwandte Themen