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];
}
}
}
Но я нахожу элемент, который нужно добавить, даже если он существует.
Что я делаю неправильно?
Ответы
Ответ 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.