2015-03-09 3 views

ответ

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]; 
+0

Ницца! Есть ли проблемы с« lowercaseString »на неанглийских персонажах? –

+1

Хорошее сообщение в блоге на KVC и такие обычаи: [Fun with KVC] (http://www.noodlesoft.com/blog/2009/06/30/fun-with-kvc/) – zaph

+0

Например: http://www.i18nguy.com/unicode/turkish-i18n.html –

1
  1. Сравнить массив насчитывает
  2. Скопировать в новые NSMutableArrays
  3. Сортировка массивов (sortUsingComparator: с NSCaseInsensitiveSearch и DiacriticInsensitiveSearch)
  4. парами с целью сравнения строк (NSCaseInsensitiveSearch и DiacriticInsensitiveSearch)

Как только появится отказ возврата NO
Если нет отказа ДА

Примечание. Для сортировки массивов с разумным размером имеет низкую стоимость, близкую к O (n).

+0

С шагом 4 вы напишите цикл? Я думал, что смогу сделать что-то вроде преобразования их в NSSet, а затем сделать isEqualToSet, переопределив сравнительный коэффициент (каким-то образом). Мысли? –

+0

Просто используйте петлю. Как говорит Кент Бек: «Сделайте простую вещь, которая может работать». Не беспокойтесь о производительности, если это не доказано. – zaph

+0

Хороший совет. Вы знаете, возможен ли метод, который я предложил, в objc? –