1

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

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

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

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

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

4

3 回答 3

0

如果您的元素都是 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--];
        }
    }
}
于 2013-01-26T11:33:53.167 回答
0

试试这个:

// 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];  
    }
}
于 2013-01-26T11:36:36.937 回答
0

没有测试,告诉我它是否不起作用。假设数组中的对象是字符串并且格式是“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));
    }
}
于 2013-01-26T11:40:57.833 回答