2012-03-28 12 views
7

Buduję aplikację w xcode4.3/Objective-C i napotkałem problem podczas próby sortowania NSMutableArray. Zapełnię go ciągami z bazy danych sqlite. Problem występuje w przypadku szwedzkich znaków å, ä i ö.Jak mogę posortować tablicę ciągów alfabetycznie, gdy łańcuch zawiera åäö?

Tablica uporządkowana powinna wyglądać mniej więcej tak: as, br, ol, st, år, ög, ös.

Ale kiedy używam selektora porównaj kolejność jest następująca: as, år, br, ol, ög, ös, st.

I kiedy używam localizedCompare, zmiana zamówienia na: as, år, br, ög, ol, ös, st.

Zgodnie ze starszymi wątkami, rozwiązanie localizedCompare powinno być rozwiązaniem, ale nie mogę sprawić, aby działało poprawnie. Jeśli korzystam z terminalu, aby uzyskać dostęp do bazy danych sqlite i wpisz ZAMÓWIENIE, otrzymam poprawny wynik. Czy mój problem mógł być związany z niektórymi ustawieniami w kodzie Xcode lub symulatorze iphone, ponieważ żaden z nich nie wyświetla prawidłowej kolejności? Lub jest zlokalizowaneCompare niewłaściwy sposób iść? Z radością przyjmuję wszelkie obejścia, o ile wykona to zadanie. Dzięki.

+0

można podać kod, który służy to zrobić? – David

+0

Chciałbym sprawdzić, czy 'localizedStandardCompare:' jest inny. W przeciwnym razie konieczne może być zaimplementowanie własnego komparatora (lub od tego, że wspominamy o SQLite DB ... jeśli używasz danych podstawowych, możesz pozwolić DB na sortowanie, ustawiając deskryptory sortowania w żądaniu pobierania). – rickster

+0

Porównanie lokalne powinno działać, ale tylko wtedy, gdy twoje ustawienia narodowe (w twoim komputerze) są ustawione na Szwecję. Najdziwniejsze jest to, że jeśli loguję tablicę, słowa ze znakami specjalnymi nie są drukowane, ale są wyświetlane jako kody Unicode. Jeśli loguję poszczególne słowa, logują się poprawnie i we właściwej kolejności. – rdelmar

Odpowiedz

13

Można zrobić to praca przy użyciu compare:options:range:locale: i określając szwedzki locale wyraźnie, jak to:

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

Wyjście jest:

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 
Powiązane problemy