0

一意の配列の作成に関するSOスレッドを読みましたが、残念ながらうまくいきませんでした。

背景情報 -

  • 20 個のオブジェクトで満たされた objectArray があります。
  • フィールド NSNumber * number を持つ NSObject sampleData。
  • maxCount は、必要な乱数の数をユーザーが入力する int です。
  • 以下は、Xcode での私のコードと、関数を呼び出すための戻り値です。

.m

-(IBAction) testButton
{
[self chooseNumber];
}

-(void)chooseNumber
{
    maxCount = [numberOfClues.text intValue];
   // NSInteger rdmNumber = arc4random()%objectArray.count;

    int count = 0;
    do {

        NSInteger rdmNumber = arc4random()%objectArray.count;
        if (![dataArray containsObject:[NSNumber numberWithInt:rdmNumber]])
        {
            currentData.number = [NSNumber numberWithInt:rdmNumber];
            [dataArray addObject:currentData];
            currentData=nil;
            currentData= [[sampleData alloc]init];
            count++;    
            NSLog(@"random no - %d",rdmNumber);
        }
    } while (count < maxCount);
    NSLog(@"Array got %d numbers",dataArray.count);
}

NSLog からの戻り値

2012-11-29 08:26:50.888 randomNumbers[1255:11303] random no - 5
2012-11-29 08:26:50.892 randomNumbers[1255:11303] random no - 8
2012-11-29 08:26:50.926 randomNumbers[1255:11303] random no - 5
2012-11-29 08:26:50.930 randomNumbers[1255:11303] random no - 10
2012-11-29 08:26:50.933 randomNumbers[1255:11303] random no - 4
2012-11-29 08:26:50.946 randomNumbers[1255:11303] random no - 10
2012-11-29 08:26:50.949 randomNumbers[1255:11303] random no - 9
2012-11-29 08:26:50.952 randomNumbers[1255:11303] random no - 12
2012-11-29 08:26:50.955 randomNumbers[1255:11303] random no - 0
2012-11-29 08:26:50.957 randomNumbers[1255:11303] random no - 15
2012-11-29 08:26:50.960 randomNumbers[1255:11303] random no - 1
2012-11-29 08:26:50.963 randomNumbers[1255:11303] random no - 8
2012-11-29 08:26:50.964 randomNumbers[1255:11303] random no - 18
2012-11-29 08:26:50.966 randomNumbers[1255:11303] random no - 14
2012-11-29 08:26:50.968 randomNumbers[1255:11303] random no - 12
2012-11-29 08:26:50.977 randomNumbers[1255:11303] random no - 14
2012-11-29 08:26:50.980 randomNumbers[1255:11303] random no - 3
2012-11-29 08:26:50.983 randomNumbers[1255:11303] random no - 6
2012-11-29 08:26:50.986 randomNumbers[1255:11303] random no - 15
2012-11-29 08:26:50.989 randomNumbers[1255:11303] random no - 7
2012-11-29 08:26:50.992 randomNumbers[1255:11303] Array got 20 numbers

配列がすべて一意の番号を取得するようにするにはどうすればよいですか?

4

3 に答える 3

2

本当に配列が必要ですか? NSMutableSet を使用しないのはなぜですか?

ドキュメントから

NSMutableSet クラスは、異なるオブジェクトの可変で順序付けされていないコレクションへのプログラム インターフェイスを宣言します。

于 2012-11-29T09:03:24.583 に答える
1

これは以前にも聞かれたと思います。配列に 1 ~ 20 の数字を入力し、配列をシャッフルしてから、シャッフルされた配列から最初 (n) の数字を選択できます。

ここで答えました:https://stackoverflow.com/a/12649065/210171

于 2012-11-29T09:20:15.437 に答える
1

問題はここにあります

if (![dataArray containsObject:[NSNumber numberWithInt:rdmNumber]]) {
     currentData.number = [NSNumber numberWithInt:rdmNumber];
     [dataArray addObject:currentData];

インスタンスをチェックしてNSNumberいますが、配列内に配置していません。NSNumberまったく異なるものを配置しています(currentData)。

順序付け (本当に順序付けが必要ですか?) と一意性の両方が必要な場合は、 と を組み合わせてNSArray使用NSSet​​すると効果的です。もちろん、これは、一意性チェックを必要とする多くの操作を行う場合にのみ、より効果的です。配列を作成し、それを変更せずに使用するだけの場合は、実装を使用[NSArray containsObject:]する方が適切です。すべてを特別なクラスに抽象化することは、常に良い解決策です。

@interface UniqueArray

@property (nonatomic, strong, readonly) NSArray* elements;

- (BOOL)addObject:(id)object;

@end
@interface UniqueArray ()

@property (nonatomic, strong, readwrite) NSArray* elements;
@property (nonatomic, strong, readwrite) NSMutableSet* set;

@end

@implementation UniqueArray

- (id)init {
   self = [super init];

   if (!self) {
      return nil;
   }

   self.elements = [NSMutableArray array];
   self.set = [NSMutableSet set];

   return self;
}

- (BOOL)addObject:(id)object {
   if ([self.set containsObject:object]) {
      return NO;
   }

   [self.set addObject:object];
   [(NSMutableArray*) self.elements addObject:object];

   return YES;
}

@end

于 2012-11-29T09:05:55.060 に答える