0

このアレイのクリーニング方法を使用しようとしていますが、エラーが発生しているようです。私はそれを見つけることができません、私は配列が3116アイテムで入り、3116で出てくることを知っています(そして私は事実のために3つの重複があることを知っています。

アドバイスをお願いします、ありがとう!

-(NSArray*) removeDuplicates:(NSArray*)inputArray{
NSMutableArray *arrayToClean = [NSMutableArray arrayWithArray:inputArray];
for (int i =0; i<[arrayToClean count]; i++) {

    for (int j=(i+1); j < [arrayToClean count]; j++) {
        if ([[arrayToClean objectAtIndex:i] isEqual:[arrayToClean
                                                     objectAtIndex:j]]) {
            [arrayToClean removeObjectAtIndex:j];
            j--;

        }

    }
}
NSArray *arrayToReturn = [NSArray arrayWithArray:arrayToClean];
return arrayToReturn;

}

4

3 に答える 3

2

NSSet を使用すると、これがはるかに簡単になります。

-(NSArray *)removeDuplicates:(NSArray *)inputArray {
    NSSet *unique = [NSSet setWithArray:inputArray];

    return [unique allObjects];
}

セットには順序が保証されていないことに注意してください。配列内のオブジェクトを特定の順序にする必要がある場合は、結果の配列を必要に応じて並べ替える必要があります。

元の配列の代わりにan を使用することも適切な場合がありますNSSet。その場合、重複についてまったく心配する必要はありません。ただし、これはアレイの他のニーズによって異なります。

于 2012-11-18T19:27:21.980 に答える
1

これは、以前のプロジェクトでまったく同じことを行うためのヘルパー関数です。

- (NSMutableArray *)removeDuplicates:(NSMutableArray *)sortedArray{
NSMutableSet* valuesAdded = [NSMutableSet set];
NSMutableArray* filteredArray = [[NSMutableArray alloc] init];
NSString* object;

/* Iterate over the array checking if the value is a member of the set. If its not add it
 * to the set and to the returning array. If the value is already a member, skip over it.
 */
for (object in sortedArray){
    if (![valuesAdded member:object]){
        [valuesAdded addObject:object];
        [filteredArray addObject:object];
    }
}
return filteredArray;
}
于 2012-11-18T20:18:29.800 に答える
1

ねえ、これには別の代替手段を使用できNSSetます。このタスクにはここを使用できます。

NSSetは、個別のオブジェクトの静的セットのプログラム インターフェイスを宣言します。要素の順序が重要ではなく、オブジェクトがセットに含まれているかどうかをテストする際のパフォーマンスが考慮される場合、配列の代わりにセットを使用できます。メンバーシップのテストは、セットよりも遅くなります。

以下のメソッドを呼び出すだけです。

-(NSArray *)removeDuplicates:(NSArray *)inputArray {
   NSSet *finalData = [NSSet setWithArray:inputArray];

    return [finalData allObjects];
}

上記の複製をクリーニングする方法で実際に問題が発生した場合は、別の代替案を試すことができます。

 -(NSArray *)removeDuplicates:(NSArray *)inputArray {
  NSMutableArray *inputArray1=[NSMutableArray arrayWithArray:inputArray];
  NSMutableArray  *finalARray=[[NSMutableArray alloc]init];
    for (id obj in inputArray1)
   {
    if (![finalARray containsObject:obj])
     {
        [finalARray addObject: obj];

 }
 NSLog(@"new array is %@",finalARray);
 }
 return finalARray;
}

お役に立てば幸いです...

于 2012-11-18T20:04:27.880 に答える