3

内部に NSStrings を含む NSObject があります。一意の obj.name を持つオブジェクトを NSMutableArray にのみ追加するにはどうすればよいですか? NSOrderedSet を試しましたが、内部に NSString を含むオブジェクトではなく、配列に NSString を追加した場合にのみ機能します。

例。

@@interface MyObject : NSObject
@property (strong, nonatomic) NSString *name;
@end


NSMutableArray *array = {MyObject.name,MyObject.name,MyObject.name};

2 つの MyObject が同じ名前にならないようにするにはどうすればよいですか?

4

3 に答える 3

1

すべての NSSet クラスはisEqual:、 と組み合わせて使用​​しhash:て同等性を比較します。これらを再定義していないため、同じ名前の 2 つのオブジェクトをセットに格納するだけで、isEqual:およびの NSObject 実装hash:が使用されます。

ドキュメントのオーバーライドに関するNSObject ProtocolisEqualhash. Stackoverflow に関するこのhash以前の回答では、isEqual正しく実装する方法について詳しく説明しています。

NSStringハッシュの独自の実装では、のメソッドを使用できますhash

- (NSUInteger) hash {
    NSUInteger prime = 31;
    NSUInteger result = 1;

   result = prime * result + [super hash];
   result = prime * result + self.name == nil ? 0 : [self.name hash];

   return result;
}

- (bool) isEqual:(id)other {
   if (other == self) {
       return YES;
   }
   if (!other || ![other isKindOfClass:[self class]]) {
        return NO;
   }

   return [self.name isEqualToString:other.name];
}
于 2013-10-21T20:28:11.903 に答える
0

個人的には、MyObject.name をキーとして NSMutableDictionary を使用します。そうすれば、あなたがしなければならないのはこれだけです:

if( myDictionary[MyObject.name] == nil )
{
    myDictionary[MyObject.name] = MyObject;
}

実行している追加の数に基づいて、通常の NSMutableArray を使用するよりもはるかに効率的です。さらに、すべての値の配列にアクセスしたい場合は、次のことを行うだけです。

NSArray *array = [myDictionary allValues];

NSPredicate の Big-O ランタイムは O(n) で、辞書メソッドは O(1) です。

于 2013-10-21T20:36:30.477 に答える