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?
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:
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"]"
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:)];
name
khô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?
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]];
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
)
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 description
theo cách này:
NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];
Đ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;
}
-(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];
}