0

私はオブジェクトを持ってNSArrayStoreます。各Storeオブジェクトには 2 つNSStringのオブジェクトがあります。StoreIDNameNSArrayオブジェクトでこれにIDが存在するかどうかをすばやく確認したいと思いStoreます。

例:

Store *s1 = [[Store alloc] init];
s1.name = @"Some Name";
s1.id = @"123ABC";

Store *s2 = [[Store alloc] init];
s2.name = @"Some Other Name";
s2.id = @"ABC123";

NSArray *array = [[NSArray alloc] initWithObjects:s1, s2, nil];

NSString *myIdOne = @"ABCDEF";
NSString *myIdTwo = @"123ABC";

BOOL myIdOneExists = ...?
BOOL myIdTwoExists = ...?

それは...?私が理解する必要があります。見つかったときにループとブレークを使用してこれを実行できることはわかっています...しかし、理論的には、何千ものオブジェクトを含めることができるforため、これは厄介なアプローチのように思えます。 そこで、より良い解決策について知りたいと思います。NSArray

4

4 に答える 4

4

問題は次のとおりです。どのソリューションを使用しても、多かれ少なかれ「配列をループして、オブジェクトが見つかったかどうかを返す」ことになります。非常に特定の条件が満たされない限り、これよりも速く配列を検索する方法はありません (たとえば、配列が検索している値で既にソートされている場合など)。述語を使用することも、列挙子を使用することも、高速列挙を使用することも、テスト ブロックを使用することもできます。内部的には、これらはすべて「配列をループしてテストを実行する」ことになります。それが配列の仕組みです。

これを頻繁に行う必要があり、素朴な解決策ではパフォーマンスが問題になる場合、賢明な解決策は ID を NSSet にキャッシュすることです。セットは高速メンバー検出用に調整されているため、配列よりもはるかに迅速に答えを得ることができるはずです。

私の個人的な「ループオーバーザアレイ」ソリューション:

BOOL idExists = NSNotFound != [stores indexOfObjectPassingTest:^(Store *store, NSUInteger idx, BOOL *stop) {
    return [store.id isEqualToString:@"whatever"];
}];

(ブラウザで書かれているので、コンパイラに注意してください。)

于 2012-12-06T18:34:30.757 に答える
2

これを試して:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@",@"id", myID];
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
if (filteredArray.count > 0)
  Store *store = [filteredArray objectAtIndex:0];
于 2012-12-06T16:58:10.597 に答える
1

最も簡単な解決策は、KVC を使用することだけです。

NSArray *results = [array valueForKey:@"id"];
BOOL myIdOneExists = [results containsObject:myIdOne];
BOOL myIdTwoExists = [results containsObject:myIdTwo];
于 2012-12-06T17:02:28.857 に答える
1
-(BOOL) id:(NSString*) theId existsInArray:(NSArray*) theArray {
    for (Store* theStore in theArray) {
        if ([theStore.id isEqualToString theId]) {
            return YES;
        }
    }
    return NO;
}

もう 1 つの方法は、ID のみを比較するisEqualメソッドを実装することです。Store次に、Store探している ID でダミー オブジェクトを作成し、ダミー オブジェクトを参照してindexOfObjectorを使用します。containsObjectStore

于 2012-12-06T17:06:43.483 に答える