2

私がやりたいのは、 を作成することですNSMutableSet。その目的は、一意のデータのペアがいくつあるかを数えることです。

基本的に、2 つの可変配列があります。xCoordinatesyCoordinates、および と呼ばれるカスタム オブジェクトXYPoint。一致するインデックスの各 X 座標と Y 座標を組み合わせて、デカルト平面上の点を作成します。たとえば、インデックス 2 では、xCoordinates配列内に数値 4 とyCoordinates配列内に数値 8 があり、ポイント (4, 8) を作成します。

さて、問題の要点として、私がやりたいことは、一意のポイントがいくつあるかを確認することです。私はそれを行うために を使用することを計画してNSMutableSetいました。すなわち:

for (int i = 0; i < [xCoordinates count]; i++) {

        XYPoint *newXY = [[XYPoint alloc] init];
        newXY.xCoordinate = [xCoordinates objectAtIndex:i];
        newXY.yCoordinate = [yCoordinates objectAtIndex:i];

        if ([distinct containsObject:newXY] == NO) {

            [distinct addObject:newXY];

        }

    }

残念ながら、それはうまくいきません。言い方はありますか?

if (there isn't an object in the set with an identical X coordinate property and Y coordinate property){

    Add one to the set;

}

?

4

4 に答える 4

2

これは、Rakesh の提案の拡張版です。

数値から文字列への変換の微妙な問題に悩まされることはありません。さらに、冗長な条件を省略します。

カスタム クラスの代わりに共通NSValueポイント ラッパーを使用しますXYPoint

for (NSUInteger i = 0; i < [xCoordinates count]; ++i) {
    CGPoint p = { [xCoordinates[i] floatValue], [yCoordinates[i] floatValue] };
   [distinct addObject:[NSValue valueWithCGPoint:p]];
}
于 2013-04-23T08:24:30.610 に答える
2

ここで最高のweichselの答えを拡張すると、クラスの実装は次のようになります。

@interface XYCoordinate : NSObject
-(id) initWithX: (NSNumber*) newX andY: (NSNumber*) newY;
@property (readonly, copy) NSNumber* x;
@property (readonly, copy) NDNumber* y;
@end

@implementation XYCoordinate

@synthesize x = _x;
@synthesize y = _y;

-(id) initWithX: (NSNumber*) newX andY: (NSNumber*) newY
{
    self = [super init];
    if (self != nil)
    {
         [self setX: newX];
         [self setY: newY];
    }
    return self;
}

-(BOOL) isEqual: (id) somethingElse
{
    BOOL ret = NO;
    if ([somethingElse isKindOfClass: [XYCoordinate class]])
    {
        ret = [[self x] isEqual: [somethingElse x]] && [[self y] isEqual: [somethingElse y]]
    }
    return ret;
}

-(NSUInteger) hash
{
     return [[self x] hash] + [[self y] hash];  // Probably a rubbish hash function, but it will do
}
@end
于 2013-04-23T09:34:48.337 に答える
0

私の頭の上では、特定のケースでは一意の結果をもたらす操作で十分かもしれません(ただし、最も効率的なソリューションではないかもしれません)。

for (int i = 0; i < [xCoordinates count]; i++) {

    NSString *xStr = [[xCoordinates objectAtIndex:i] stringValue];
    NSString *yStr = [[yCoordinates objectAtIndex:i] stringValue];
    NSString *coordStr = [NSString stringWithFormat:@"%@ %@",xStr,yStr]; //edited
    if (![distinct containsObject:coordStr]) {
       [distinct addObject:coordStr];
    }
}

それは私が推測する必要があります。あなたのソリューションは毎回機能していませんでした。新しいオブジェクトが作成され、等しくなりませんでした。しかし、上記のような NSString の場合はそうではありません。ただの迅速な解決策。

于 2013-04-23T08:09:05.173 に答える