一系列独特的元素,但条件 -

时间:2014-07-11 12:00:33

标签: objective-c

我有一个整数数组(确切地说是NSMutable数组),现在我希望数组有唯一的元素,但是有一个问题。

条件-1。如果有2个(偶数个)元素相似则需要删除这两个元素。 条件2。如果有3个(奇数个)元素,则数组中只剩下1个元素。

试图解决它时遇到了一些问题。 我试图用2个临时变量循环数组

 for(int i =1;i<[tagArray count];i++){
    int temp1 = [[tagArray objectAtIndex:i] intValue];
    int temp2 = [[tagArray objectAtIndex:i-1] intValue];
    if(temp1==temp2){

        [tagArray removeObjectIdenticalTo:[tagArray objectAtIndex:i]];
        [tagArray removeObjectAtIndex:i];
        NSLog(@"%@",tagArray);
    }
}

此代码可以工作,但是当数组中有很多元素时,我得到的输出不是所需的。 P.S-阵列已经被随机填充,所以我先冒昧地对它进行排序。

还有一件事。请不要说abt set,我想要独特的元素但是当我使用SET时看到条件1和2.我不能执行那些。

2 个答案:

答案 0 :(得分:2)

  1. 排序数组(通过升序或降序intValue)
  2. 循环遍历每个元素(从0到N-1)并计算先前等于元素的数量(将其写入equalNumbersCount)。
  3. 当前数字变得与之前的数字不相等后,请查看equalNumberCount并删除必要数量的元素(如果此计数> 1且均匀,则删除全部,如果是奇数,则仅删除equalNumberCount - 1以前的元素)
  4. 将equalNumberCount重置为0.
  5. 像这样的东西。经过测试,似乎工作正常:

        NSMutableArray *arr = [@[@1, @4, @4, @2, @2, @3, @3, @3, @4, @4, @5] mutableCopy];
        arr = [[arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
            return [obj1 compare:obj2];
        }] mutableCopy];
    
        uint countOfEqualElements = 1;
        for (uint i = 1; i < arr.count; i++) {
            NSNumber *n1 = arr[i-1];
            NSNumber *n2 = arr[i];
            if ( [n2 isEqualToNumber:n1]) {
                countOfEqualElements++;
            }
            else if (countOfEqualElements > 1){
                uint numToRemove = countOfEqualElements % 2 == 0 ? countOfEqualElements : countOfEqualElements - 1;
                countOfEqualElements = 1;
                NSRange r;
                r.length = numToRemove;
                r.location = i - numToRemove;
                NSIndexSet * is = [NSIndexSet indexSetWithIndexesInRange:r];
    
                [arr removeObjectsAtIndexes:is];
                i -= numToRemove;
            }
        }
    

答案 1 :(得分:0)

虽然我还没有使用其他元素进行测试,但目前我认为这可能至少让你感兴趣。

NSArray *localArray = @[@"1",@"23",@"2",@"3",@"4",@"5",@"5",@"9",@"1",@"11",@"10",@"1",@"23",@"3"];
NSCountedSet *countedSet= [[NSCountedSet alloc] initWithArray:localArray];

NSMutableArray *arrayToCheck = [localArray mutableCopy];
for (id obj in [localArray mutableCopy])
{
   if([countedSet countForObject:obj]==2)
   {
       [arrayToCheck removeObject:obj inRange:NSMakeRange([[localArray mutableCopy] indexOfObject:obj], [arrayToCheck count]-[[localArray mutableCopy] indexOfObject:obj])];
   }
    else if ([countedSet countForObject:obj]==3)
    {
       [arrayToCheck removeObject:obj inRange:NSMakeRange([[localArray mutableCopy] indexOfObject:obj], [arrayToCheck count]-[[localArray mutableCopy] indexOfObject:obj])];
        [arrayToCheck addObject:obj];
    }
}
localArray = [NSArray arrayWithArray:arrayToCheck];
NSLog(@" array is %@",localArray);