NSArray'i alfabetik olarak nasıl sıralayabilirim?


Yanıtlar:


725

En basit yaklaşım, bir sıralama seçici sağlamaktır ( ayrıntılar için Apple'ın belgeleri )

Objective-C

sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

hızlı

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "YourKey", ascending: true, selector: "localizedCaseInsensitiveCompare:")
let sortedResults: NSArray = temparray.sortedArrayUsingDescriptors([descriptor])

Apple, alfabetik sıralama için çeşitli seçiciler sunar:

  • compare:
  • caseInsensitiveCompare:
  • localizedCompare:
  • localizedCaseInsensitiveCompare:
  • localizedStandardCompare:

hızlı

var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students.sort()
print(students)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"

Referans


5
Dokümantasyon bağlantısı eski, kod örneği diziyi gerçekten sıralamak için yeterli değil. localizedCaseInsensitiveCompare: bir şekilde tanımlanması gerekir.
M. Ryan

34
Bağlantıyı güncelledim. Bunu işaret ettiğiniz için teşekkürler. localizedCaseInsensitiveCompare: NSString yöntemidir ve bir dizeyi sıralamak için yeterli olmalıdır.
Thomas Zoechling

1
Ve bu, herhangi bir özel nesne içeren bir diziye kolayca uygulanabilir (sadece NSString değil). Dizinizin içindeki tüm nesnelerin, seçicinin belirttiği mesajı uyguladığından emin olmanız yeterlidir. Sonra bu iletinin içinde, karşılaştırmak istediğiniz nesnenin özellikleri için NSString karşılaştırmasını çağırmanız yeterlidir.
lgdev

Bu kadar basit şeyler çok karmaşık olmamalıdır.
Dmitry

276

Burada verilen diğer yanıtlar @selector(localizedCaseInsensitiveCompare:) Bu NSString dizisi için harika çalışır, ancak bunu başka bir nesne türüne genişletmek ve bu nesneleri bir 'name' özelliğine göre sıralamak istiyorsanız, bunun yerine bunu yapmalısınız:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
sortedArray=[anArray sortedArrayUsingDescriptors:@[sort]];

Nesneleriniz, bu nesnelerin name özelliğine göre sıralanır.

Sıralamanın büyük / küçük harfe duyarsız olmasını istiyorsanız, açıklayıcıyı bu şekilde ayarlamanız gerekir

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];

14
+1, Teşekkürler. Komik, bu kabul edilen cevaptan daha yaygın kullanım durumudur.
Vinay K

4
bu önce büyük harfleri sonra küçük harfleri sıralar
HarshIT

+1, Seçici ile birlikte sıralama tanımlayıcısı tam olarak istediğim şeydi ve başka hiçbir cevabı yoktu. Çok teşekkürler adam
Ganesh Somani

1
nameGeçerli bir anahtar olmadığından , dizeleri bu şekilde sıralamaya çalıştığımda bir hata alıyorum . Dizeleri NSSortDescriptor ile alfabetik olarak sıralamak için hangi anahtarı kullanırım?
temporary_user_name

27

NSNumericSearch gibi şeyleri kullanmak için bir NSString listesini sıralamanın daha güçlü bir yolu:

NSArray *sortedArrayOfString = [arrayOfString sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
        }];

SortDescriptor ile birlikte, bu gibi bir şey verecek:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) {
        return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
    }];
NSArray *sortedArray = [anArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];

10

Alfabetik sırayla sıralama için aşağıdaki kodu kullanın:

    NSArray *unsortedStrings = @[@"Verdana", @"MS San Serif", @"Times New Roman",@"Chalkduster",@"Impact"];

    NSArray *sortedStrings =
    [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];

    NSLog(@"Unsorted Array : %@",unsortedStrings);        
    NSLog(@"Sorted Array : %@",sortedStrings);

Konsol günlüğü aşağıdadır:

2015-04-02 16:17:50.614 ToDoList[2133:100512] Unsorted Array : (
    Verdana,
    "MS San Serif",
    "Times New Roman",
    Chalkduster,
    Impact
)

2015-04-02 16:17:50.615 ToDoList[2133:100512] Sorted Array : (
    Chalkduster,
    Impact,
    "MS San Serif",
    "Times New Roman",
    Verdana
)

10

Dizeleri sıralamak için bir başka kolay yöntem de NSString descriptionözelliğini şu şekilde kullanmaktır:

NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];

1
Bu biraz işe yaramaz görünüyor; dizeleri bu şekilde sıralamak için bir neden yoktur (ve muhtemelen bunu yapmak için bir performans vardır) ve diğer nesneler için açıklama özelliği sıralama amaçları için nadiren yararlıdır.
mah

3

Bunun zaten birçok amaç için iyi cevapları var, ancak daha spesifik olan benim ekleyeceğim.

İngilizcede, normalde alfabetik yaptığımızda, bir cümlenin başındaki "the" kelimesini görmezden geliriz. Bu yüzden "ABD", "T" yerine "U" altında sipariş edilir.

Bunu sizin için yapar.

Bunları kategorilere koymak muhtemelen en iyisidir.

// Sort an array of NSStrings alphabetically, ignoring the word "the" at the beginning of a string.

-(NSArray*) sortArrayAlphabeticallyIgnoringThes:(NSArray*) unsortedArray {

    NSArray * sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(NSString* a, NSString* b) {

        //find the strings that will actually be compared for alphabetical ordering
        NSString* firstStringToCompare = [self stringByRemovingPrecedingThe:a];
        NSString* secondStringToCompare = [self stringByRemovingPrecedingThe:b];

        return [firstStringToCompare compare:secondStringToCompare];
    }];
    return sortedArray;
}

// Remove "the"s, also removes preceding white spaces that are left as a result. Assumes no preceding whitespaces to start with. nb: Trailing white spaces will be deleted too.

-(NSString*) stringByRemovingPrecedingThe:(NSString*) originalString {
    NSString* result;
    if ([[originalString substringToIndex:3].lowercaseString isEqualToString:@"the"]) {
        result = [[originalString substringFromIndex:3] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    }
    else {
        result = originalString;
    }
    return result;
}

Ben sadece bu yıllar sonra baktım ve ben de "a" ve "an" içermesi gerektiğini fark ettim. Bunların eklenmesi kolay olmalıdır.
narco

1
-(IBAction)SegmentbtnCLK:(id)sender
{ [self sortArryofDictionary];
    [self.objtable reloadData];}
-(void)sortArryofDictionary
{ NSSortDescriptor *sorter;
    switch (sortcontrol.selectedSegmentIndex)
    {case 0:
            sorter=[[NSSortDescriptor alloc]initWithKey:@"Name" ascending:YES];
            break;
        case 1:
            sorter=[[NSSortDescriptor alloc]initWithKey:@"Age" ascending:YES];
            default:
            break; }
    NSArray *sortdiscriptor=[[NSArray alloc]initWithObjects:sorter, nil];
    [arr sortUsingDescriptors:sortdiscriptor];
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.