web-dev-qa-db-ja.com

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];
            } 
        }
}

しかし、存在する場合でも追加するアイテムを見つけます。

私は何を間違えていますか?

42
Neelesh

私は解決策を見つけました、すべての中で最も効率的ではないかもしれませんが、少なくとも動作します

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

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

その後、配列の追加を繰り返し、アイテムを挿入します。

39
Neelesh

NSArrayにはこれに非常に便利なメソッドがあります。つまり、containsObjectです。

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

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];
}
22
EmptyStack

試しましたか - 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;
}
5
knuku

NSSetをご覧ください。オブジェクトを追加できます。オブジェクトは、オブジェクトが一意である場合にのみ追加されます。 NSArrayまたはその逆からNSSetを作成できます。

4
Charged Neuron

NR4TRは正しく言いましたが、1つbreakステートメントで十分だと思います


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

INameプロパティの比較に基づいてYES/NOを返すように、オブジェクトのisEqualshashをオーバーライドできます。

使用できるようになったら...

- (void)removeObjectsInArray:(NSArray *)otherArray

残りのすべてのオブジェクトを追加する前にリストを消去します。

2
Simon Lee

小文字を変換し、空白を削除してからチェックします。

[string lowercaseString];  

そして

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

AddListの最初のオブジェクトとappDelegate.listの最初のオブジェクトを比較し、等しくない場合は、addListのオブジェクトを挿入します。ロジックが間違っています。1つのaddListのオブジェクトをすべてのappDelegate.listのオブジェクトと比較する必要があります。

1
Terence