Подтвердить что ты не робот

NSMutableArray проверяет, существует ли объект

Я не уверен, как это сделать. У меня есть NSMutableArray (addList), который содержит все элементы, которые будут добавлены в мой источник данных NSMutableArray.

Теперь я хочу проверить, существует ли объект, добавляемый из массива addList, в массив данных. Если он не существует, добавьте элемент, если существует игнорировать.

Оба объекта имеют строковую переменную iName, которую я хочу сравнить.

Вот мой фрагмент кода

-(void)doneClicked{
    for (Item *item in addList){
        /*
        Here i want to loop through the datasource array 
        */
        for(Item *existingItem in appDelegate.list){
            if([existingItem.iName isEqualToString:item.iName]){
                // Do not add
            }
            else{
                [appDelegate insertItem:item];
            } 
        }
}

Но я нахожу элемент, который нужно добавить, даже если он существует.

Что я делаю неправильно?

4b9b3361

Ответ 1

Я нашел решение, возможно, не самый эффективный из всех, но по крайней мере работает

NSMutableArray *add=[[NSMutableArray alloc]init];

for (Item *item in addList){
        if ([appDelegate.list containsObject:item])
            {}
        else
            [add addObject:item];
}

Затем я перебираю массив добавления и вставляю элементы.

Ответ 2

В NSArray существует очень полезный метод, т.е. containsObject.

NSArray *array;
array = [NSArray arrayWithObjects: @"Nicola", @"Margherita",                                       @"Luciano", @"Silvia", nil];
if ([array containsObject: @"Nicola"]) // YES
{
    // Do something
}

Ответ 3

Используйте NSPredicate.

NSArray *list = [[appDelegate.list copy] autorelease];

for (Item *item in addList) {

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"iName MATCHES %@", item.iName];
    NSArray *filteredArray = [list filteredArrayUsingPredicate:predicate];
    if ([filteredArray count] > 0) [appDelegate insertItem:item];
}

Ответ 4

Вы пробовали indexOfObject:?

-(void)doneClicked{
    for (Item *item in addList){
        if([appDelegate.list indexOfObject:item] == NSNotFound){
            [appDelegate insertItem:item];
        }
}

ОБНОВЛЕНИЕ: У вас есть логическая ошибка, а не ошибка в коде. предположим, что первый массив равен ['a', 'b', 'c'], а второй - ['a', 'x', 'y', 'z']. Когда вы повторяете "a" через второй массив, он не добавит "a" ко второму массиву в первую итерацию (сравните "a" с "a" ), но добавьте во время второго (сравните "a" с "x" "). Вот почему вы должны внедрить метод isEqual: (см. Ниже) в свой объект Item и использовать приведенный выше код.

- (BOOL)isEqual:(id)anObject {
    if ([anObject isKindOfClass:[Item class]])
        return ([self.iName isEqualToString:((Item *)anObject).iName]);
    else
        return NO;
}

Ответ 5

Посмотрите на NSSet. Вы можете добавлять объекты, и объект будет добавлен, только если объект уникален. Вы можете создать NSSet из NSArray или наоборот.

Ответ 6

Вы можете переопределить isEquals и hash на объекте, чтобы он возвращал YES/NO на основе сравнения свойства iName.

После этого вы можете использовать...

- (void)removeObjectsInArray:(NSArray *)otherArray

Очистить список перед добавлением всех остальных объектов.

Ответ 7

NR4TR правильно сказано, но я думаю, что достаточно одного выражения break


if([existingItem.iName isEqualToString:item.iName]){
                // Do not add
break;
            }
 

Ответ 8

Преобразуйте прописные и строчные пробелы, а затем проверьте..

[string lowercaseString];  

и

NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

Ответ 9

Вы сравниваете первый объект addList и первый объект appDelegate.list, если они не равны, вы вставляете объект addList. Логика неправильная, вы должны сравнить один объект addList с каждым объектом appDelegate.list.