2012-11-18 68 views
0

我正在嘗試使用此數組清理方法,並且似乎出現了錯誤。我不能發現它,我知道陣列3116項進去,出來與3116(我知道一個事實,有三個重複。陣列清理方法中的錯誤

請指點,謝謝!

-(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; 

}

+0

所提出的代碼似乎是正確的(雖然沒有效率也不優雅)。 –

回答

2

的NSSet將使這個輕鬆了許多:

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

    return [unique allObjects]; 
} 

請注意,一組沒有保證的順序如果您需要的對象的數組中是在一個特定的順序,那麼你應該排序RESU。根據需要排列數組。

也可以使用NSSet代替原始數組,因此您根本不必擔心重複。但這取決於數組的其他需求。

+0

非常有效和簡單 –

1

嘿您可以使用其他替代方案。您可以使用此處的NSSet執行此任務。

NSSet聲明靜態集不同的對象 可以使用集作爲替代陣列時元素的順序是一個對象是否包含在該組並不重要,並且在性能測試的編程接口是一個代價─當數組被排序時,測試成員資格比使用集合更慢。

你只需要調用下面的方法。

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

    return [finalData allObjects]; 
} 

如果真的在上面的清理方法中遇到任何問題,那麼你可以嘗試另一個Alterantive。

-(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; 
} 

我希望它可以幫助你......

+0

嗯,我有模糊的感覺,我已經閱讀過此之前... –

+0

@NikolaiRuhe是的,這可能是true.it的simple.is'nt可能的兩個人真正的邏輯在這裏SO ...? – Kamarshad

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; 
}