2009-12-07 3 views
1

Я сканирование WiFi информации с использованием NSMutableArray, но есть несколько повторяющихся значений появляются, так что я пытаюсь использовать следующий код, но по-прежнему получать повторяющиеся значения,как удалить повторяющееся значение в NSMutableArray

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

, как это можно решить, спасибо

ответ

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]; 
4

Вы должны использовать NSMutableSet в первую очередь.

Для устранения всех двойных записей в массиве, увидеть этот вопрос:
Make NSMutableArray or NSMutableSet unique.

+0

я есть попробовать с NSMutableSet, но все еще не может удалить, – Apache

+0

'NSSet' требует, чтобы ваши объекты реализации' '-hash' и -isEqual:' , вы это сделали? –

+2

Наборы не имеют порядка. – mxcl

3

Вот код удаления дубликатов значений из NSMutable Array..it будет работать на вас. туАггау это ваш Мутабельном массива, который вы хотите удалить значение дубликатов ..

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

Вы можете столкнуться с проблемами, если вы манипулируете массив в то время как цикл в мой опыт.

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 
1

Это еще один способ:

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

работать для меня спасибо ... – kb920

 Смежные вопросы

  • Нет связанных вопросов^_^