首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标-C:订购一个在空格前面显示逗号的NSArray

目标-C:订购一个在空格前面显示逗号的NSArray
EN

Stack Overflow用户
提问于 2017-08-13 15:35:55
回答 3查看 63关注 0票数 0

假设我有一个NSArray:

代码语言:javascript
复制
#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

如果按字母顺序对集合进行排序,则得到以下顺序:

  • MacBook航空,11“
  • MacBook Pro,13“
  • MacBook,12“

我希望看到的是:

  • MacBook,12“
  • MacBook航空,11“
  • MacBook Pro,13“

如何对NSArray排序以将逗号放在空格之前?

EN

回答 3

Stack Overflow用户

发布于 2017-08-13 15:53:09

我确信有更优雅和健壮的解决方案,但是在比较字符串时,您可以简单地忽略逗号:

代码语言:javascript
复制
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:@" "]];
}];

结果:

代码语言:javascript
复制
"MacBook, 12\"",
"MacBook Air, 11\"",
"MacBook Pro, 13\""
票数 0
EN

Stack Overflow用户

发布于 2017-08-13 17:43:05

这对您的情况可能有些过分,但我可能会建议将逗号视为“分隔符”,这意味着您希望首先按照逗号之前的所有内容进行排序,并且只有在它们相同的情况下,才考虑逗号后面的字符串部分。这与“空格前的逗号排序”逻辑非常相似,但可能会更好地处理边缘情况。

您可以将这个“逗号作为分隔符”逻辑概括为处理任意数量的组件,如下所示:

代码语言:javascript
复制
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”进行排序(即需要数字排序)。

票数 0
EN

Stack Overflow用户

发布于 2017-08-13 18:33:12

基本上,您要做的是按照字符串的部分排序,直到第一个,,这是一个分隔符,而不是排序字符串的一部分。

所以简单地做,你想做的事:

代码语言:javascript
复制
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。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45662034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档