2012-03-28 13 views
7

Sto costruendo un'app in xcode4.3/Objective-C e ho riscontrato un problema durante il tentativo di ordinare un NSMutableArray. Lo compilerò con stringhe da un database SQLite. Il problema si verifica con i caratteri svedesi å, ä e ö.Come posso ordinare una serie di stringhe alfabeticamente quando le stringhe contengono åäö?

L'array orded dovrebbe essere simile a questo: as, br, ol, st, år, ög, ös.

Ma quando utilizzo il selettore confronta l'ordine è questo: come, år, br, ol, ög, ös, st.

E quando uso localizedCompare l'ordine cambia in: come, år, br, ög, ol, ös, st.

In base ai thread precedenti, la soluzione localizzata dovrebbe essere la soluzione, ma non riesco a farlo funzionare correttamente. Se utilizzo il terminale per accedere al database sqlite e digito ORDINA, otterrò il risultato corretto. Il mio problema potrebbe essere correlato ad alcune impostazioni in xcode o nel simulatore iphone, poiché nessuno dei due visualizza l'ordine corretto? O è localizzato? Confronta la strada sbagliata? Accetterò felicemente qualsiasi soluzione alternativa finché il lavoro verrà completato. Grazie.

+0

Potete fornire il codice che si utilizza per fare questo? – David

+0

Vorrei controllare se 'localizedStandardCompare:' è diverso. In caso contrario, potrebbe essere necessario implementare il proprio comparatore (o dato che si menziona un DB SQLite ... se si utilizza Core Data è possibile lasciare che il DB esegua l'ordinamento impostando i descrittori di ordinamento su una richiesta di recupero). Il confronto localizzato – rickster

+0

dovrebbe funzionare, ma solo se la tua locale (nel tuo computer) è impostata su Svezia. La cosa strana che ottengo è che se registro l'array le parole con caratteri speciali non vengono stampate ma vengono visualizzate come codici unicode. Se registro le singole parole, esse accedono correttamente e nell'ordine corretto. – rdelmar

risposta

13

È possibile farlo funzionare utilizzando compare:options:range:locale: e specificando locale svedese esplicitamente, in questo modo:

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); } 

L'output è:

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 
Problemi correlati