【问题标题】:Objective-C NSMutableArrayObjective-C NSMutableArray
【发布时间】:2013-01-26 11:15:39
【问题描述】:

我已经用我的数据库中的整数和字符串值填充了一个 NSMutableArray。 问题是多次插入了许多值。 使用以下代码我删除重复的对象

for (id object in originalArray) {
    if (![singleArray containsObject:object]) {
        [singleArray addObject:object];
    }
}

只有当它们之间的对象完全相同时,总线才有效。 有没有办法根据整数值删除重复项?

EDIT(来自 OP 对已删除答案的评论)

我有一些包含intNSString 的对象。例如@"John 13"@"Mary 25"@"Luke 25"@"Joan 13"NSMutableArray 将包含所有四个名称和 13、25 的重复项。我想删除重复项,只在数组中留下 13 和 25 一次。我不在乎哪些名字会被删除。只关心整数值以供以后使用。

【问题讨论】:

  • 您在对我的回答的评论中提供的示例(现在已删除,因为它显然不正确)对于理解问题至关重要。到目前为止,它几乎使您得到的每个答案都无效!下次写题的时候,请加个小例子。
  • 拥有数据的事实就是这种尴尬的格式,这可能意味着您可以在其他地方做得更好。例如。如果您负责创建这些字符串,那么将数字/名称对放入字典或其他数据结构中不是更好吗?
  • 它们不都是字符串。名称是字符串,数字是整数。我只是把它们一起写成对象。例如“John 13”是数组中的一个对象,其中“John”是字符串值,“13”是整数值

标签: objective-c xcode object nsmutablearray


【解决方案1】:

如果你的元素都是 NSNumber 对象:

for (int i=0;i<array.count;i++) {
    for (int j=i+1;j<array.count;j++) {
        if ([array[i] isEqualToNumber:array[j]]) {
           [array removeObjectAtIndex:j--];
        }
    }
}

或者如果所有对象都是整数 NSNumbers 或包含整数值的 NSStrings:

for (int i=0;i<array.count;i++) {
    for (int j=i+1;j<array.count;j++) {
        if ([array[i] intValue] == [array[j] intValue]) {
           [array removeObjectAtIndex:j--];
        }
    }
}

【讨论】:

    【解决方案2】:

    试试这个:

    // singleArray is initially empty
    for (id object in originalArray) 
    {
        BOOL contains= YES;
        for( id single in singleArray)
        {
            if( [single integerValue]==[object integerValue] )
            {
                contains= NO;
                break;
            }
        }
        if(contains)
        {
            [singleArray addObject: object];  
        }
    }
    

    【讨论】:

      【解决方案3】:

      没有测试,如果它不起作用,请告诉我。假设数组中的对象是字符串,格式是“WORD NUMBER”

      Boolean myEqual(const void *value1, const void *value2) {
          NSString *str1 = (__bridge NSString *)(value1);
          NSString *str2 = (__bridge NSString *)(value2);
          NSArray *arr1 = [str1 componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
          NSArray *arr2 = [str2 componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
          return [[arr1 lastObject] isEqual:[arr2 lastObject]];
      }
      
      CFHashCode myHash(const void *value) {
          NSString *str1 = (__bridge NSString *)(value);
          NSArray *arr1 = [str1 componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
          return [[arr1 lastObject] hash];
      }
      
      
      NSMutableArray *array = // your array;
      CFSetCallBacks callBacks = kCFTypeSetCallBacks;
      callBacks.equal = myEqual;
      callBacks.hash = myHash;
      CFMutableSetRef set = CFSetCreateMutable(NULL, [array count], &callBacks);
      for (id obj in [array copy]) {  // copy so can modify the original array
          if (CFSetContainsValue(set, (__bridge const void *)(obj))) {
              [array removeObject:obj];
          } else {
              CFSetAddValue(set, (__bridge const void *)(obj));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2012-03-01
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多