sorting在nsdictionary上给出不同的结果比在nsarraysorting

2天前我问了如何通过string对象中的第二个字sorting元素的问题

我在这里得到解决scheme

但现在我陷入了新的问题

考虑我有

nsarray与 – >名称和

nsdictionary使用相同的名称(nsarray)作为键值和电子邮件ID

而我的nsarray包含

"Test Teacher" "Anonymous" "Dok Teacher" 

和我的nsdictionary包含

  "Dok Teacher" --"a@g.com" "Anonymous" -- "b@g.com" "Test Teacher" --"c@g.com" 

因为我需要sorting这些数组和字典我使用上面的链接给出的方法sorting

但sorting后,我得到的数据如下

nsarraysorting第二个单词后

  "Anonymous" "Test Teacher" "Dok Teacher" 

对值的第二个字进行sorting之后的nsdictionary

  "Anonymous" -- "b@g.com" "Dok Teacher" --"a@g.com" "Test Teacher" --"c@g.com" 

为什么老师和testing老师在词典和nsarray中的不同位置,使用同样的方法进行sorting。

以及如何让它们以相同的顺序排列和字典。

代码sortingnsarray:

 NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:[teachersNames sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; return [firstTeacher2ndWord compare:secondTeacher2ndWord]; }]]; NSLog(@"After %@",sortedArray); teachersSrc=[NSMutableArray arrayWithArray:sortedArray]; 

用于sortingnsdictionary的代码

  myArray = [teachersList keysSortedByValueUsingComparator:^NSComparisonResult(id a, id b) { NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString]; return [firstTeacher2ndWord compare:secondTeacher2ndWord]; }]; NSLog(@"After %@",myArray); 

编辑:

我也曾尝试对数组和字典的名字进行sorting,然后对两者的姓氏进行sorting,但是根本不工作,

鉴于你有这样的:

  NSArray *array = @[@"Test Teacher",@"Anonymous",@"Dok Teacher"]; NSDictionary *dictionary = @{@"a@g.com":@"Dok Teacher",@"b@g.com":@"Anonymous",@"c@g.com":@"Test Teacher"}; //sort the array first NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSString *firstTeacher2ndWord =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject]; NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject]; if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE){ // means they are the same //compare full text firstTeacher2ndWord = (NSString *)obj1; secondTeacher2ndWord = (NSString *)obj2; } return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch]; }]; NSLog(@"Sorted Array %@",sortedArray); //sort the dictionary key using values NSArray *sortedDictionaryKey =[dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSString *firstTeacher2ndWord =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject]; NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject]; if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE){ // means they are the same //compare full text firstTeacher2ndWord = (NSString *)obj1; secondTeacher2ndWord = (NSString *)obj2; } return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] }]; //get the values from the dictionary based on the sorted keys NSLog(@"Sorted Dictionary %@",[dictionary objectsForKeys:sortedDictionaryKey notFoundMarker:[NSNull null]]); 

会给你这个输出:

 //Sorted Array Sorted Array( Anonymous, "Dok Teacher", "Test Teacher" ) //Sorted Dictionary Sorted Dictionary( Anonymous, "Dok Teacher", "Test Teacher" ) 

首先,字典(teachersList)的值数组是未sorting的,您不知道如何排列元素。

第二个Dok TeacherTest Teacher在第二个单词上是一样的,他们之间没有顺序,sorting后的顺序依赖于sorting方法(稳定或不稳定)和原始排列的顺序。

如果值数组中的元素在teachersNames顺序相同,则结果将相同。 否则, Dok TeacherTest Teacher是不确定的。

注意:这里的数组数组是teachersList.allValues

代码中的问题是Teacher包含的第二个名字。 所以当你sorting相同的数组。 它将按字母顺序排列名称。 由于第二个名字对于两个单词是相同的。 所以它不会反映在输出中。 但是,如果您更改顺序,那么您可以看到预期的输出。 我已经实现了对下面的数组进行sorting的代码:

当执行下面的代码时,你会得到输出:

  NSArray *array1=@[@"Test Teacher",@"Anonymous",@"Dok Teacher"]; NSArray *sortedArray=[array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2 options:NSCaseInsensitiveSearch]; }]; NSLog(@"%@",sortedArray); 

输出: –

  Anonymous, "Dok Teacher", "Test Teacher"