私はこれについてどうするかわかりません。 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];
}
}
}
しかし、存在する場合でも追加するアイテムを見つけます。
私は何を間違えていますか?
私は解決策を見つけました、すべての中で最も効率的ではないかもしれませんが、少なくとも動作します
NSMutableArray *add=[[NSMutableArray alloc]init];
for (Item *item in addList){
if ([appDelegate.list containsObject:item])
{}
else
[add addObject:item];
}
その後、配列の追加を繰り返し、アイテムを挿入します。
NSArrayにはこれに非常に便利なメソッドがあります。つまり、containsObjectです。
NSArray *array;
array = [NSArray arrayWithObjects: @"Nicola", @"Margherita", @"Luciano", @"Silvia", nil];
if ([array containsObject: @"Nicola"]) // YES
{
// Do something
}
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];
}
試しましたか - indexOfObject:
?
-(void)doneClicked{
for (Item *item in addList){
if([appDelegate.list indexOfObject:item] == NSNotFound){
[appDelegate insertItem:item];
}
}
UPDATE:コードの間違いではなく、論理的な間違いがあります。最初の配列が['a'、 'b'、 'c']であり、2番目の配列が['a'、 'x'、 'y'、 'z']であると仮定します。 2番目の配列で「a」を反復処理する場合、最初の反復では「a」を2番目の配列に追加しません(「a」を「a」と比較します)が、2番目に追加します(「a」を「x」と比較します) ')。 isEqual:
メソッド(下記参照)を 'Item'オブジェクトで使用し、上記のコードを使用します。
- (BOOL)isEqual:(id)anObject {
if ([anObject isKindOfClass:[Item class]])
return ([self.iName isEqualToString:((Item *)anObject).iName]);
else
return NO;
}
NSSetをご覧ください。オブジェクトを追加できます。オブジェクトは、オブジェクトが一意である場合にのみ追加されます。 NSArrayまたはその逆からNSSetを作成できます。
NR4TRは正しく言いましたが、1つbreakステートメントで十分だと思います
if([existingItem.iName isEqualToString:item.iName]){
// Do not add
break;
}
INameプロパティの比較に基づいてYES/NOを返すように、オブジェクトのisEquals
とhash
をオーバーライドできます。
使用できるようになったら...
- (void)removeObjectsInArray:(NSArray *)otherArray
残りのすべてのオブジェクトを追加する前にリストを消去します。
小文字を変換し、空白を削除してからチェックします。
[string lowercaseString];
そして
NSString *trim = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
AddListの最初のオブジェクトとappDelegate.listの最初のオブジェクトを比較し、等しくない場合は、addListのオブジェクトを挿入します。ロジックが間違っています。1つのaddListのオブジェクトをすべてのappDelegate.listのオブジェクトと比較する必要があります。