Bagaimana saya bisa mengurutkan array yang diisi [UIFont familyNames]
ke dalam urutan abjad?
Bagaimana saya bisa mengurutkan array yang diisi [UIFont familyNames]
ke dalam urutan abjad?
Jawaban:
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"]"
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:)];
name
bukan kunci yang valid. Kunci apa yang saya gunakan untuk mengurutkan string berdasarkan abjad dengan NSSortDescriptor?
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]];
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
)
Metode mudah lain untuk mengurutkan array string terdiri dengan menggunakan description
properti NSString dengan cara ini:
NSSortDescriptor *valueDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES];
arrayOfSortedStrings = [arrayOfNotSortedStrings sortedArrayUsingDescriptors:@[valueDescriptor]];
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;
}
-(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];
}