1

NSMutableArrayPersonタイプのオブジェクトを含むがあります。Personオブジェクトには、NSString* name、NSString* dateStamp、およびNSString*testScoreのパラメーターが含まれています。高速列挙を使用して実行したいのは、NSMutableArray* testResultsで確認し、同じ名前のパラメーターを持つオブジェクトが存在するかどうかを確認することです。

含まれている場合は、の既存のオブジェクトを、NSMutableArray挿入しようとしているオブジェクトに置き換えます。このオブジェクトには、最新のdateStamptestScore値が含まれます。名前パラメータが一致しないオブジェクトが見つかった場合は、私が持っているオブジェクトを挿入するだけです。

これまでの私のコードは次のようになります。

これは、挿入しようとしているオブジェクトを作成するコードです。

Person *newPerson = [[Person alloc] init];
    [newPerson setPersonName:newName]; //variables newName, pass, and newDate have already been 
    [newPerson setScore:pass];      //created and initialized
    [newPerson setDateStamp:newDate];

これは、NSMutableArrayを反復処理して、同じ名前のパラメーターを持つオブジェクトが既に存在するかどうかを確認するコードです。

for (Person *checkPerson in personList) { //personList is of type NSMutableArray

        if (newPerson.newName == checkPerson.name) {

           //here is where I need to insert the code that replaces checkPerson with newPerson after a match has been found   


        }

        else {

             personList.addObject(newPerson); //this is the code that adds the new object to the NSMutableArray when no match was found.
    }

}

それほど複雑な問題ではありませんが、一致するものを見つけて、オブジェクトがどのインデックスにあるかを事前に知らずに実際のオブジェクトを置き換える方法について混乱しています。

4

1 に答える 1

7

indexOfObjectPassingTestを使用して、一致するものを探します。

    NSInteger indx = [personList indexOfObjectPassingTest:^BOOL(Person *obj, NSUInteger idx, BOOL *stop) {
        return [obj.name isEqualToString:newPerson.name];
    }];
    if (indx != NSNotFound) {
        [personList replaceObjectAtIndex:indx withObject:newPerson];
    }else{
        [personList addObject:newPerson];
    }

==ではなく2つの文字列を比較するためにisEqualToString:を使用したことに注意してください。その間違いは、このフォーラムで何百万回も質問され、答えられてきました。

命名に一貫性がありません。質問では、Personオブジェクトにnameプロパティがあると言いますが、新しいpersonを作成するときは、setPersonNameを使用します。これは、プロパティ名がpersonNameであることを意味します。私は、私の答えに名前を付けるだけだと思いました。

于 2012-12-17T05:49:17.460 に答える