如何删除NSMutableArray中的重复值

时间:2009-12-07 08:38:57

标签: iphone nsmutablearray duplicate-removal

我正在使用NSMutableArray扫描wifi信息,但是显示的重复值很少,所以我尝试使用以下代码但仍然获得重复值,

if([scan_networks count] > 0) 
{
    NSArray *uniqueNetwork = [[NSMutableArray alloc] initWithArray:[[NSSet setWithArray:scan_networks] allObjects]];
    [scan_networks removeAllObjects];

    NSSortDescriptor *networkName = [[[NSSortDescriptor alloc] initWithKey:@"SSID_STR" ascending:YES] autorelease];
    NSArray *descriptors = [NSArray arrayWithObjects:networkName,nil];

    [scan_networks addObjectsFromArray:[uniqueNetwork sortedArrayUsingDescriptors:descriptors]];
}

如何解决这个问题,谢谢

6 个答案:

答案 0 :(得分:4)

您应该首先使用NSMutableSet

要消除数组中的所有双项,请参阅以下问题:
Make NSMutableArray or NSMutableSet unique.

答案 1 :(得分:4)

你可以使用NSSET但是如果它只在订单无关紧要时才使用,那么请采用这种方法。我已经使用过它,它给出了完美的答案。在NSmutableArray数组的位置放置包含重复值的NSmutableArray。

NSArray *copy = [NSmutableArray copy];

NSInteger index = [copy count] - 1;

for (id object in [copy reverseObjectEnumerator])
 {

 if ([NSmutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound)

 {
        [NSmutableArray removeObjectAtIndex:index];

 }

    index--;
}

[copy release];

答案 2 :(得分:3)

以下是从NSMutableArray中删除重复值的代码。它将适合您。 myArray是你想要删除重复值的可变数组..

for(int j = 0; j < [myArray count]; j++){
    for( k = j+1;k < [myArray count];k++){
        NSString *str1 = [myArray objectAtIndex:j];
        NSString *str2 = [myArray objectAtIndex:k];
        if([str1 isEqualToString:str2])
            [myArray removeObjectAtIndex:k];
       }
}
// Now print your array and 

答案 3 :(得分:1)

我认为最好这样做:

 NSMutableIndexSet *indexes = [[NSMutableIndexSet alloc]init];

 for(int j = 0; j < [myArray count]; j++) {

 for( k = j+1;k < [myArray count];k++) {

    NSString *str1 = [myArray objectAtIndex:j];
    NSString *str2 = [myArray objectAtIndex:k];
    if([str1 isEqualToString:str2])
        [indexes addIndex:k];
   }
}

[myArray removeObjectsAtIndexes:indexes];

如果您根据我的经验循环操作数组,则可能会遇到问题。

答案 4 :(得分:1)

这是另一种方式:

- (NSArray *)removeDuplicatesFrom:(NSArray *)array {
    NSSet *set = [NSSet setWithArray:array];
    return [set allObjects];
}

答案 5 :(得分:0)

也许您可以尝试NSArray类别。

#import <Foundation/Foundation.h>

@interface NSArray(filterRepeat)
-(NSArray *)filterRepeat;

@end


#import "NSArray+repeat.h"
@implementation NSArray(filterRepeat)
-(NSArray *)filterRepeat
{
    NSMutableArray * resultArray =[NSMutableArray array];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if (![resultArray containsObject: obj]) {
            [resultArray addObject: obj];
        }
    }];
    return resultArray;
}
@end