2012-03-28 17 views
7

Bir uygulamayı xcode4.3/Objective-C içinde yapıyorum ve bir NSMutableArray öğesini sıralamaya çalışırken bir sorunla karşılaştım. Bir sqlite veritabanından dizelerle doldururum. Sorun å, ä ve ö isveç karakterleri ile gerçekleşir.Dizeler åäö içerdiğinde dizeleri alfabetik olarak nasıl sıralayabilirim?

Ordedeki dizi şöyle bir şeye benzemelidir: as, br, ol, st, år, ög, ös.

Ama ben seçiciyi kullandigimda sirayi karşılaştırın: as, år, br, ol, ög, ös, st.

Ve lokal olarak kullanıldığında Sipariş değişikliğini aşağıdaki gibi yapın: as, år, br, ög, ol, ös, st.

Daha eski konulara göre localizedCompare çözüm olmalı, ancak düzgün çalışmasını sağlayamıyorum. Sqlite veritabanına erişmek için terminali kullanır ve SİPARİŞ yazın doğru sonucu alacağım. Sorunum ne doğru görüntülendiğinden, sorunum xcode veya iphone simülatöründeki bazı ayarlarla ilgili olabilir mi? Ya da yerelleştirilir Yanlış gitmek için bir yol mu var? İşi tamamladığı sürece herhangi bir geçici çözümü kabul ediyorum. Teşekkürler.

+0

Bunu yapmak için kullandıkları kod verebilir misiniz? – David

+0

"localizedStandardCompare:" öğesinin farklı olup olmadığını kontrol ediyorum. Başarısız, kendi karşılaştırıcısını uygulamanız gerekebilir (ya da bir SQLite DB'den bahsetmiş olduğunuzdan ... eğer Çekirdek Verileri kullanıyorsanız, DB'nin sıralama getirilerini bir getirme isteğinde ayarlayarak sıralama yapmasına izin verebilirsiniz). – rickster

+0

Yerelleştirilmiş karşılaştırmalar çalışmalıdır, ancak yalnızca yerel ayarınız (makinenizde) İsveç'e ayarlanmışsa. Garip olan şey, diziyi günlüğe kaydedersem özel karakterler içeren kelimeler yazdırmaz, ancak unicode kodları olarak gösterilir. Eğer bireysel kelimeleri günlüğe kaydedersem doğru şekilde ve doğru sırayla kayıt yaparlar. – rdelmar

cevap

13

Sen böyle, compare:options:range:locale: kullanarak ve açıkça İsveçli yerel belirterek çalışması yapabilir:

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

çıktısı:

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 
İlgili konular