Bagaimana cara mengurutkan NSArray secara alfabet?

375

Bagaimana saya bisa mengurutkan array yang diisi [UIFont familyNames]ke dalam urutan abjad?

DotSlashSlash
sumber

Jawaban:

725

Pendekatan yang paling sederhana adalah, menyediakan pemilih sortir ( dokumentasi Apple untuk detail)

Objektif-C

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

Cepat

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

Apple menyediakan beberapa penyeleksi untuk penyortiran alfabet:

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

Cepat

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

Referensi

Thomas Zoechling
sumber
5
Tautan dokumentasi sudah usang, contoh kode tidak cukup untuk menyortir array. localizedCaseInsensitiveCompare: perlu didefinisikan entah bagaimana.
M. Ryan
34
Saya memperbarui tautan. Terima kasih telah menunjukkannya. localizedCaseInsensitiveCompare: adalah metode NSString dan harus cukup untuk mengurutkan array string.
Thomas Zoechling
1
Dan ini dapat dengan mudah diterapkan pada array yang berisi objek kustom apa pun (bukan hanya NSString). Anda hanya perlu memastikan bahwa semua objek di dalam array Anda telah mengimplementasikan pesan yang ditentukan pemilih. Kemudian di dalam pesan ini Anda hanya perlu membandingkan NSString untuk properti objek yang ingin Anda bandingkan.
lgdev
Hal-hal sederhana seperti itu tidak boleh begitu rumit.
Dmitry
276

Jawaban lain yang disediakan di sini menyebutkan menggunakan @selector(localizedCaseInsensitiveCompare:) Ini berfungsi baik untuk array NSString, namun jika Anda ingin memperluas ini ke jenis objek lain, dan mengurutkan objek-objek tersebut sesuai dengan properti 'nama', Anda harus melakukan ini sebagai gantinya:

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

Objek Anda akan diurutkan sesuai dengan properti nama objek tersebut.

Jika Anda ingin penyortiran menjadi tidak peka huruf besar-kecil, Anda perlu mengatur deskriptor seperti ini

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
JP Hribovsek
sumber
14
+1, Terima kasih. Lucu ini adalah kasus penggunaan yang lebih umum daripada jawaban yang diterima.
Vinay W
4
ini jenis huruf kapital pertama dan kemudian kecil
HarshIT
+1, deskriptor pengurutan dan pemilih adalah persis apa yang saya inginkan dan tidak ada jawaban lain yang memiliki ini. Terima kasih banyak
Ganesh Somani
1
Saya mendapatkan kesalahan ketika saya mencoba mengurutkan array string dengan cara ini, karena namebukan kunci yang valid. Kunci apa yang saya gunakan untuk mengurutkan string berdasarkan abjad dengan NSSortDescriptor?
temporary_user_name
27

Cara yang lebih ampuh untuk menyortir daftar NSString untuk menggunakan hal-hal seperti NSNumericSearch:

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

Dikombinasikan dengan SortDescriptor, itu akan memberikan sesuatu seperti:

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]];
Ben G
sumber
10

Gunakan kode di bawah ini untuk mengurutkan dalam urutan abjad:

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

Di bawah ini adalah log konsol:

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
)
Jayprakash Dubey
sumber
10

Metode mudah lain untuk mengurutkan array string terdiri dengan menggunakan descriptionproperti NSString dengan cara ini:

NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];
Lisarien
sumber
1
Tampaknya agak tidak berguna; tidak ada alasan untuk menyortir string dengan cara ini (dan mungkin ada hit kinerja untuk melakukannya), dan untuk objek lain, properti deskripsinya jarang berguna untuk tujuan penyortiran.
mah
3

Ini sudah memiliki jawaban yang bagus untuk sebagian besar tujuan, tetapi saya akan menambahkan jawaban saya yang lebih spesifik.

Dalam bahasa Inggris, biasanya ketika kita abjad, kita mengabaikan kata "the" di awal frasa. Jadi "Amerika Serikat" akan dipesan di bawah "U" dan bukan "T".

Ini melakukan itu untukmu.

Mungkin akan lebih baik untuk menempatkan ini dalam kategori.

// 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;
}
narco
sumber
Saya baru saja melihatnya beberapa tahun kemudian, dan saya menyadari bahwa itu juga harus mencakup "a" dan "an". Ini harus mudah ditambahkan.
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];
    }
deepa
sumber