如何比较NSStrings的两个NSArray,忽略大小写和顺序

时间:2015-03-09 00:11:58

标签: objective-c

我有两个NSArrays,每个都包含NSStrings。

如何检查它们是否相同,忽略大小写和顺序?

我一直在玩NSSets和NSPredicates,但没有太多运气。

2 个答案:

答案 0 :(得分:5)

简单(不区分大小写)

NSSet* one = [[NSCountedSet setWithArray:firstArray] valueForKey:@"lowercaseString"];
NSSet* two = [[NSCountedSet setWithArray:secondArray] valueForKey:@"lowercaseString"];

return [one isEqualToSet:two];

复杂(案例和变音不敏感)

此解决方案更复杂,因为它需要特殊的字符串比较。您可以通过使用this方法迭代已排序的数组来实现此目的,或者,如果您希望使用valueForKey:,则使用以下代码。

@interface LNComparisonHelper : NSObject

- (instancetype)initWithString:(NSString*)str;
@property (nonatomic, copy, readonly) string;

@end

@implementation LNComparisonHelper

- (instancetype)initWithString:(NSString*)str
{
    self = [super init];
    if(self) { _str = [str copy]; }
    return self;
}

- (BOOL)isEqual:(LNComparisonHelper*)other
{
    return [_str compare:other.string options:(DiacriticInsensitiveSearch | CaseInsensitiveSearch)] == OrderedSame;
}

@end

@interface NSString (ComparisonWrapper)

- (id) ln_casediacriticInsensitiveComparator;

@end

@implementation NSString (ComparisonWrapper)

- (id) ln_casediacriticInsensitiveComparator
{
    return [[LNComparisonHelper alloc] initWithString:self];
}

@end

NSSet* one = [[NSCountedSet setWithArray:firstArray] valueForKey:@"ln_casediacriticInsensitiveComparator"];
NSSet* two = [[NSCountedSet setWithArray:secondArray] valueForKey:@"ln_casediacriticInsensitiveComparator"];

return [one isEqualToSet:two];

答案 1 :(得分:1)

  1. 比较数组计数
  2. 复制到新的NSMutableArrays
  3. 对数组进行排序(sortUsingComparator:使用NSCaseInsensitiveSearch和DiacriticInsensitiveSearch)
  4. 按顺序比较字符串(NSCaseInsensitiveSearch和DiacriticInsensitiveSearch)
  5. 一旦出现故障,则返回否 如果没有失败是

    注意:对于合理大小的数组,排序的成本接近于O(n)。