假设我有一个NSArray:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSArray *array = @[@"MacBook Pro, 13\"", @"MacBook, 12\"", @"MacBook Air, 11\""];
NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSLog(@"sortedArray: %@", sortedArray);
}
@end如果按字母顺序对集合进行排序,则得到以下顺序:
我希望看到的是:
如何对NSArray排序以将逗号放在空格之前?
发布于 2017-08-13 15:53:09
我确信有更优雅和健壮的解决方案,但是在比较字符串时,您可以简单地忽略逗号:
NSArray *array = @[@"MacBook Pro, 13\"", @"MacBook, 12\"", @"MacBook Air, 11\""];
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [[(NSString *)obj1 stringByReplacingOccurrencesOfString:@"," withString:@" "] compare:[(NSString *)obj2 stringByReplacingOccurrencesOfString:@"," withString:@" "]];
}];结果:
"MacBook, 12\"",
"MacBook Air, 11\"",
"MacBook Pro, 13\""发布于 2017-08-13 17:43:05
这对您的情况可能有些过分,但我可能会建议将逗号视为“分隔符”,这意味着您希望首先按照逗号之前的所有内容进行排序,并且只有在它们相同的情况下,才考虑逗号后面的字符串部分。这与“空格前的逗号排序”逻辑非常相似,但可能会更好地处理边缘情况。
您可以将这个“逗号作为分隔符”逻辑概括为处理任意数量的组件,如下所示:
NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSArray <NSString *>*array1 = [obj1 componentsSeparatedByString:@","];
NSArray <NSString *>*array2 = [obj2 componentsSeparatedByString:@","];
for (NSInteger index = 0; index < array1.count; index++) {
if (index >= array2.count) { return NSOrderedDescending; }
NSString *string1 = [array1[index] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSString *string2 = [array2[index] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSComparisonResult result = [string1 compare:string2 options:NSCaseInsensitiveSearch | NSNumericSearch];
if (result != NSOrderedSame) { return result; }
}
return array2.count > array1.count ? NSOrderedAscending : NSOrderedSame;
}];注意,我还假设:(a)您需要大小写不敏感的排序;(b)您希望忽略分隔符之前或之后的额外空格;(c)您希望在"11“之前对"9”进行排序(即需要数字排序)。
发布于 2017-08-13 18:33:12
基本上,您要做的是按照字符串的部分排序,直到第一个,,这是一个分隔符,而不是排序字符串的一部分。
所以简单地做,你想做的事:
NSArray *sortedArray = [array sortedArrayUsingComparator:
^(NSString *left, NSString *right)
{
NSRange separatorRange;
separatorRange [left rangeOfString:@","];
if( separatorRange.length>0 )
{
left = [left substringToIndex:separatorRange.location];
}
separatorRange [right rangeOfString:@","];
if( separatorRange.length>0 )
{
right = [right substringToIndex:separatorRange.location];
}
return [left compare:right];
}];输入Safari。
https://stackoverflow.com/questions/45662034
复制相似问题