使用NSSortDescriptorsorting结束时简单的方法?

我正在使用NSSortDescriptorsorting一个NSArrayNSDictionary项目。 很好的工作,只是我需要的…除了我想为我的sorting键的空白值的字典项目显示在sorting列表的末尾。 有没有办法轻松完成这个? 或者我将不得不创build一些自定义的sortingfunction? 不,我不想把它设置为DESC顺序…我想sorting结果看起来像A,A,B,B,C,空白,空白。

在看到使用自定义比较的另一个示例之后找出了这一点。 这是我最终的代码:

 @interface NSString (CustomStatusCompare) - (NSComparisonResult)customStatusCompare:(NSString*)other; @end @implementation NSString (CustomStatusCompare) - (NSComparisonResult)customStatusCompare:(NSString*)other { NSAssert([other isKindOfClass:[NSString class]], @"Must be a NSString"); if ([self isEqual:other]) { return NSOrderedSame; } else if ([self length] > 0 && [other length] > 0) { return [self localizedCaseInsensitiveCompare:other]; } else if ([self length] > 0 && [other length] == 0) { return NSOrderedAscending; } else { return NSOrderedDescending; } } @end NSSortDescriptor *serviceTypeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Service" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; NSSortDescriptor *locationDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Location" ascending:YES selector:@selector(customStatusCompare:)]; //using custom comparison here! NSArray *descriptors = [NSArray arrayWithObjects:locationDescriptor, nameDescriptor, nil]; self.navArray = [self.navArray sortedArrayUsingDescriptors:descriptors]; 

所以如果两个string都是空的,则比较器返回NSOrderedSame …如果两个string都是非空的,则调用常规比较函数…如果只有一个string是空的,则它将反转该比较的正常顺序。 瞧!

做sorting使用NSNumericSort而不是NSDiacriticInsensitive或NSCaseInsensitive。 由于ASCII代码中的空白可能是256,它将被发送到列表的后面。

编辑:我误解了这个问题,并认为其意图是将string与领先的空格首先sorting(他们应该反正)。

你想要这样的东西,我想。 这是完全没有经过testing,并没有考虑到多个领先的空间。 我相信有一个更优雅的方式,但它应该完成工作。

 NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { NSString *str1 = (NSString *)obj1; NSString *str2 = (NSString *)obj2; BOOL str1HasSpace = [str1 hasPrefix:@" "]; BOOL str2HasSpace = [str2 hasPrefix:@" "]; if (str1HasSpace && !str2HasSpace) { return NSOrderedAscending; } else if (str2HasSpace && ! str1HasSpace) { return NSOrderedDescending; } else { return [[str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] compare:[str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]]; } }];