1

NSMutableArray にデータベースからの整数値と文字列値を入力しました。問題は、多くの値が複数回挿入されたことです。次のコードを使用して、重複したオブジェクトを削除します

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

バスこれは、オブジェクトがそれらの間でまったく同じである場合にのみ機能します。整数値に基づいて重複を削除する方法はありますか?

編集(削除された回答に対するOPのコメントから)

と を含むオブジェクトがいくつかintありますNSString。たとえば@"John 13"、、、、。@"Mary 25"_ @"Luke 25"_ @"Joan 13"には、4 つの名前すべてと 13、25のNSMutableArray重複が含まれます。配列に 13 と 25 を 1 回だけ残して、重複を削除したいと考えています。どの名前が削除されるかは気にしません。後で使用するために整数値のみに注意してください。

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 に答える