NSMutableArray проверка, если объект уже существует - PullRequest
42 голосов
/ 09 июня 2011

Я не уверен, как это сделать.У меня есть 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];
            } 
        }
}

Но я считаю, что этот элемент нужно добавить, даже если он существует.

Что я делаю не так?

Ответы [ 9 ]

72 голосов
/ 17 сентября 2012

В NSArray есть очень полезный метод, т. Е. содержит объект .

NSArray *array;
array = [NSArray arrayWithObjects: @"Nicola", @"Margherita",                                       @"Luciano", @"Silvia", nil];
if ([array containsObject: @"Nicola"]) // YES
{
    // Do something
}
39 голосов
/ 10 июня 2011

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

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

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

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

22 голосов
/ 09 июня 2011

Использование 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];
}
5 голосов
/ 09 июня 2011

Вы пробовали 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;
}
4 голосов
/ 27 мая 2012

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

2 голосов
/ 09 июня 2011

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


if([existingItem.iName isEqualToString:item.iName]){
                // Do not add
break;
            }
 
2 голосов
/ 09 июня 2011

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

Как только у вас есть это, вы можете использовать ...

- (void)removeObjectsInArray:(NSArray *)otherArray

Для очистки списка перед добавлением всех оставшихся объектов.

1 голос
/ 13 апреля 2015

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

1 голос
/ 09 июня 2011

Преобразование пробелов в нижний регистр и обрезка, а затем отметьте ..

[string lowercaseString];  

и

NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...