NSArray のすべての文字列が等しいかどうかを比較するにはどうすればよいですか?
文字列ごとに配列をスキャンする必要がありますか?
ありがとう
これを行うには、配列から新しいセットを作成します。セットには一意のエントリのみが含まれるため、セット内の要素の数が 1 の場合、配列内のすべての項目が等しくなります。
NSSet *uniqueItems = [NSSet setWithArray:yourArray];
if ([uniqueItems count] < 2) {
// All items in "yourArray" are the same (no matter how many they are)
}
上記の例では、空のセット (空の配列を意味する) も一意であると考えています。そうでない場合は、ifステートメントを次のように変更できますif ([uniqueItems count] == 1) { ... }
これは、文字列だけでなく、あらゆるオブジェクトに対しても機能します。
NSArray
クラスは汎用であるため、これを実行する機能は含まれていません。そのため、各文字列を自分で確認する必要があります。
トロイの木馬は正しいです。NSArray をカテゴリで拡張して、このようなことを行うことができます...
NSArray *array = @[ @"A", @"B", @"C" ];
__block BOOL allObjectsAreEqual = YES;
if ( array.count > 1 ) {
NSString *firstObject = array[0];
[array enumerateObjectsUsingBlock:^void(id obj, NSUInteger idx, BOOL *stop) {
if ( idx == 0 ) {
return;
}
if ( ( allObjectsAreEqual = [firstObject isEqualToString:obj] ) == NO ) {
*stop = YES;
}
}];
// And here check for allObjectsAreEqual ...
...これを行う方法はたくさんあります。
すべての文字列が互いに等しいかどうかを確認したいですか?
@interface NSArray (MyAdditions)
- (BOOL) isFilledWithEqualObjects {
if (!self.count) return YES;
id firstObject = [self objectAtIndex:0];
for (id obj in self) {
// Avoid comparing firstObject to itself (and any other pointers to
// firstObject)
if (firstObject == obj) continue;
if (![firstObject isEqual:obj]) return NO;
}
return YES;
}
@end
この例では-isEqual:
、 を使用して、あらゆる種類のオブジェクトを操作します。内容が文字列であることがわかっている場合は、-isEqualToString:
代わりに次を使用できます。
if (![firstObject isEqualToString:obj]) return NO;