Làm thế nào để sắp xếp một NSArray theo thứ tự abc?


375

Làm thế nào tôi có thể sắp xếp một mảng chứa đầy [UIFont familyNames]thứ tự chữ cái?

Câu trả lời:


725

Cách tiếp cận đơn giản nhất là, để cung cấp bộ chọn sắp xếp ( tài liệu của Apple để biết chi tiết)

Mục tiêu-C

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

Nhanh

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

Apple cung cấp một số bộ chọn để sắp xếp chữ cái:

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

Nhanh

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

Tài liệu tham khảo


5
Liên kết tài liệu đã lỗi thời, mẫu mã không thực sự đủ để sắp xếp mảng. localizedCaseInsensitiveCompare: cần được xác định bằng cách nào đó.
M. Ryan

34
Tôi đã cập nhật các liên kết. Cảm ơn đã chỉ ra rằng. localizedCaseInsensitiveCompare: là một phương thức của NSString và nên đủ để sắp xếp một chuỗi các chuỗi.
Thomas Zoechling

1
Và điều này có thể dễ dàng áp dụng cho một mảng chứa bất kỳ đối tượng tùy chỉnh nào (không chỉ NSString). Bạn chỉ cần đảm bảo rằng tất cả các đối tượng trong mảng của bạn đã triển khai thông báo mà bộ chọn đang chỉ định. Sau đó, bên trong thông báo này, bạn chỉ cần gọi so sánh NSString cho các thuộc tính của đối tượng mà bạn muốn so sánh.
lgdev

Những điều đơn giản như vậy không được quá phức tạp.
Dmitry

276

Các câu trả lời khác được cung cấp ở đây đề cập đến bằng cách sử dụng @selector(localizedCaseInsensitiveCompare:) Điều này hoạt động rất tốt cho một mảng NSString, tuy nhiên nếu bạn muốn mở rộng nó sang một loại đối tượng khác và sắp xếp các đối tượng đó theo thuộc tính 'name', thay vào đó, bạn nên thực hiện điều này:

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

Các đối tượng của bạn sẽ được sắp xếp theo thuộc tính tên của các đối tượng đó.

Nếu bạn muốn sắp xếp không phân biệt chữ hoa chữ thường, bạn cần đặt bộ mô tả như thế này

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

14
+1, Cảm ơn bạn. Buồn cười đây là trường hợp sử dụng phổ biến hơn câu trả lời được chấp nhận.
Vinay W

4
cái này sắp xếp chữ in hoa trước rồi đến chữ nhỏ
HarshIT

+1, Bộ mô tả sắp xếp cùng với bộ chọn là chính xác những gì tôi muốn và không có câu trả lời nào khác có cái này. Cảm ơn rất nhiều người đàn ông
Ganesh Somani

1
Tôi gặp lỗi khi tôi cố gắng sắp xếp một chuỗi các chuỗi theo cách này, vì đó namekhông phải là một khóa hợp lệ. Tôi sử dụng khóa nào để sắp xếp các chuỗi theo thứ tự bảng chữ cái với NSSortDescriptor?
temporary_user_name

27

Một cách mạnh mẽ hơn để sắp xếp danh sách NSString để sử dụng những thứ như NSNumericSearch:

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

Kết hợp với SortDescriptor, sẽ cung cấp một cái gì đó như:

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

Sử dụng mã dưới đây để sắp xếp theo thứ tự bảng chữ cái:

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

Dưới đây là nhật ký giao diện điều khiển:

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

Một phương pháp dễ dàng khác để sắp xếp một chuỗi các chuỗi bao gồm sử dụng thuộc tính NSString descriptiontheo cách này:

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

1
Điều đó có vẻ hơi vô dụng; không có lý do gì để sắp xếp các chuỗi theo cách này (và có lẽ có một hiệu năng đạt được khi làm như vậy) và đối với các đối tượng khác, thuộc tính mô tả của nó hiếm khi hữu ích cho việc sắp xếp các mục đích.
mah

3

Điều này đã có câu trả lời tốt cho hầu hết các mục đích, nhưng tôi sẽ thêm câu trả lời cụ thể hơn.

Trong tiếng Anh, thông thường khi chúng ta xếp theo thứ tự chữ cái, chúng ta bỏ qua từ "the" ở đầu cụm từ. Vì vậy, "Hoa Kỳ" sẽ được đặt hàng theo "U" chứ không phải "T".

Điều này làm điều đó cho bạn.

Có lẽ tốt nhất là đặt những thứ này trong danh mục.

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

Tôi chỉ nhìn vào những năm sau đó, và tôi nhận ra nó cũng nên bao gồm "a" và "an". Chúng nên dễ dàng để thêm.
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];
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.