2

インターネットでこれを検索しましたが、解決策が見つかりませんでした...

これが私が欲しいものです:

私がNSArray3つのオブジェクトを持っているとしましょう。これらの3つのオブジェクトは次のとおりです。

{

@"Hi",
@"Hi",
@"Hi"

 }

この場合、配列には3つの文字列が含まれ、それらはすべて等しいです。

これを証明したいのですが、すべてのオブジェクトをループして、それらがすべて同一である場合に返すNSArrayカテゴリBOOLメソッドを作成したいと思います。YES次に例を示します。

NSArray *array = [[NSArray alloc] initWithObjects: @"Object", @"Object", @"Object", nil];

if ([array allObjectsAreIdentical /* method I would have to create */) {

     NSLog(@"All objects in this array are identical");
}

このための組み込みのメソッドはないと確信しています。また、面倒なルートを使用せずに、各オブジェクトを手動で比較したいと思います。

ありがとう!

4

4 に答える 4

8

どうですか

NSSet *set = [NSSet setWithArray:array];
if ([set count] == 0) {
     // array is empty. Does that count as identical ?
} else if ([set count] == 1) {
     // all objects in array are identical
} else {
     // there are different objects
}

編集:NSArrayこれはカテゴリメソッドとして書かれます

-(BOOL) allObjectsAreIdentical
{
    NSSet *set = [NSSet setWithArray:self];
    return ([set count] <= 1);
}

注:このソリューションは(エレガントに見える場合でも)、必要以上に配列内のオブジェクトを比較することに注意してください。したがって、パフォーマンスが問題になる場合は、@dieworldによって提案されたソリューションなどの他のソリューションを使用することをお勧めします。

于 2012-10-11T09:57:14.263 に答える
5

リソースと時間の点で、より安価な (希望する) 方法:

- (BOOL) allObjectsAreIdentical
{
    if (self.count < 2) return YES;
    for (int i = 0; i < self.count - 1; i++) {
        if (![[self objectAtIndex: i] isEqual: [self lastObject]]) return NO;
    }
    return YES;
}

1 つのオブジェクトが常にそれ自体と等しく、0 個のオブジェクトも等しいと仮定します。

于 2012-10-11T10:04:18.080 に答える
1

少し速くなり、配列が空のときにスローされる例外を回避することをお勧めします。一般的に使用できるようにするには、NSArray のカテゴリにする必要があります。要素が 2 つ以上ない場合はチェックしません。isEqual: を呼び出す前に、オブジェクト ポインターを確認してください。多くの場合、等しいオブジェクトは実際には同じオブジェクトであると想定します。

@interface NSArray (objectsAreIdentical)
- (BOOL)allObjectsAreIdentical;
@end

@implementation NSArray (objectsAreIdentical)

- (BOOL)allObjectsAreIdentical
{
    BOOL result = YES;
    if (self.count >= 2)
    {
        id firstObject = self [0];
        for (id object in self)
        {
            if (firstObject != object && ! [firstObject isEqual:object])
            {
                result = NO;
                break;
            }
        }
    }

    return result;
}
@end
于 2014-03-12T17:42:35.663 に答える
0

私の提案は(念のためここに置くためだけに):

- (BOOL)allObjectsAreIdenticalInArray:(NSArray *)mArray
{
    if(!mArray || ![mArray count])
    {
        return YES;//if it is empty
    }

    NSString *mTestString = [mArray objectAtIndex:0];

    for(NSString *mString in mArray)
    {
        if(![mTestString isEqalToString:mString])
        {
            return NO; //we found atleast one who isnt.
        }
    }

    return YES; //everything checks out - they all are the same.
}

しかし、私はマーティンRソリューションを使用します。

于 2012-10-11T10:00:53.110 に答える