2009-08-29 88 views

Trả lời

687

Phương pháp đơn giản nhất là, để cung cấp một selector loại (Apple's documentation để biết chi tiết)

Objective-C

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

Swift

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

của Apple cung cấp một số chọn lọc dùng cho phân loại tự chữ cái:

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

Swift

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

Reference

+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 đó. –

+34

Tôi đã cập nhật liên kết. Cảm ơn bạn đã chỉ ra điều đó. localizedCaseInsensitiveCompare: là một phương thức NSString và phải đủ để sắp xếp một mảng các chuỗi. –

+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ỉ là NSString). Bạn chỉ cần đảm bảo rằng tất cả các đối tượng bên trong mảng của bạn đã thực hiện thông báo mà bộ chọn đang chỉ định. Sau đó, bên trong thông điệp 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. – Luka

264

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

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

Đố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 để được trường hợp nhạy cảm, bạn sẽ cần phải thiết lập các mô tả như thế này

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

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

+3

này sắp xếp chữ cái đầu tiên và sau đó chữ cái nhỏ – HarshIT

+0

Tôi đã chỉnh sửa câu trả lời của mình để bao gồm phân loại phân biệt chữ hoa chữ thường –

25

Một cách mạnh mẽ hơn của sắp xếp một danh sách các 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, mà sẽ cung cấp cho 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]]; 
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]; 
    } 
+0

Xấu xí hình thành phải trung thực – Mutawe

10

Sử dụng dưới mã cho sắp xếp theo thứ tự 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à giao diện điều khiển đăng nhập:

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 để sắp xếp một mảng của chuỗi bao gồm bằng NSString description sở hữu theo cách này :

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

Đ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ó thể là một hiệu suất nhấn để 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 các mục đích sắp xếp. – mah

0

Điều này đã có câu trả lời hay cho hầu hết purp oses, nhưng tôi sẽ thêm của tôi đó là cụ thể hơn.

Trong tiếng Anh, thông thường khi chúng tôi theo bảng chữ cái, chúng tôi 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 phù hợp với bạn.

Có lẽ tốt nhất nên đặt các danh mục này vào 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; 
} 
Các vấn đề liên quan