【问题标题】:how to remove duplicate value in NSMutableArray如何删除 NSMutableArray 中的重复值
【发布时间】:2009-12-07 08:38:56
【问题描述】:

我正在使用 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]];
}

如何解决,谢谢

【问题讨论】:

    标签: iphone nsmutablearray duplicate-removal


    【解决方案1】:

    您可以使用 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】:

      您首先应该使用NSMutableSet

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

      【讨论】:

      • 我尝试过使用 NSMutableSet,但仍然无法删除,
      • NSSet 要求你的对象实现-hash-isEqual:,你这样做了吗?
      【解决方案3】:

      这里是从 NSMutable Array 中删除重复值的代码。它对你有用。 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 
      

      【讨论】:

        【解决方案4】:

        我认为这样做更好:

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

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

        【讨论】:

          【解决方案5】:

          这是另一种方式:

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

          【讨论】:

            【解决方案6】:

            也许你可以试试 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
            

            【讨论】:

              猜你喜欢
              • 2013-04-20
              • 2013-04-12
              • 1970-01-01
              • 2011-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-20
              • 1970-01-01
              相关资源
              最近更新 更多