ฉันจะเรียงลำดับอาร์เรย์ที่[UIFont familyNames]
เรียงลำดับตามตัวอักษรได้อย่างไร
ฉันจะเรียงลำดับอาร์เรย์ที่[UIFont familyNames]
เรียงลำดับตามตัวอักษรได้อย่างไร
คำตอบ:
วิธีที่ง่ายที่สุดคือให้ตัวเลือกการเรียง ( เอกสารของ Appleสำหรับรายละเอียด)
Objective-C
sortedArray = [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
รวดเร็ว
let descriptor: NSSortDescriptor = NSSortDescriptor(key: "YourKey", ascending: true, selector: "localizedCaseInsensitiveCompare:")
let sortedResults: NSArray = temparray.sortedArrayUsingDescriptors([descriptor])
Apple มีตัวเลือกหลายตัวสำหรับการจัดเรียงตามตัวอักษร:
compare:
caseInsensitiveCompare:
localizedCompare:
localizedCaseInsensitiveCompare:
localizedStandardCompare:
รวดเร็ว
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students.sort()
print(students)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
คำตอบอื่น ๆ ที่ระบุไว้ในที่นี้กล่าวถึงการใช้@selector(localizedCaseInsensitiveCompare:)
งานนี้เหมาะสำหรับอาร์เรย์ของ NSString อย่างไรก็ตามหากคุณต้องการขยายไปยังวัตถุประเภทอื่นและเรียงลำดับวัตถุเหล่านั้นตามคุณสมบัติ 'ชื่อ' คุณควรทำสิ่งนี้แทน:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
sortedArray=[anArray sortedArrayUsingDescriptors:@[sort]];
วัตถุของคุณจะถูกจัดเรียงตามคุณสมบัติชื่อของวัตถุเหล่านั้น
หากคุณต้องการให้การเรียงลำดับไม่ตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณจะต้องตั้งค่า descriptor ดังนี้
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
name
ไม่ใช่รหัสที่ถูกต้อง ฉันจะใช้ปุ่มใดในการเรียงลำดับสตริงตามตัวอักษรด้วย NSSortDescriptor
วิธีที่มีประสิทธิภาพยิ่งขึ้นในการจัดเรียงรายการ NSString เพื่อใช้สิ่งต่าง ๆ เช่น NSNumericSearch:
NSArray *sortedArrayOfString = [arrayOfString sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
}];
รวมกับ SortDescriptor ที่จะให้สิ่งที่ต้องการ:
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]];
ใช้รหัสด้านล่างสำหรับการเรียงตามลำดับตัวอักษร:
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);
ด้านล่างคือบันทึกของคอนโซล:
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
)
อีกวิธีง่าย ๆ ในการเรียงลำดับอาร์เรย์ของสตริงประกอบด้วยโดยใช้description
คุณสมบัติNSString ด้วยวิธีนี้:
NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];
นี่มีคำตอบที่ดีสำหรับวัตถุประสงค์ส่วนใหญ่แล้ว แต่ฉันจะเพิ่มของฉันซึ่งเฉพาะเจาะจงมากขึ้น
ในภาษาอังกฤษโดยปกติเมื่อเราเรียงตามตัวอักษรเราจะไม่สนใจคำว่า "the" ในตอนต้นของวลี ดังนั้น "สหรัฐอเมริกา" จะถูกสั่งภายใต้ "U" ไม่ใช่ "T"
สิ่งนี้ทำเพื่อคุณ
มันอาจจะเป็นการดีที่สุดถ้าจะจัดหมวดหมู่เหล่านี้
// 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];
}