NSDictionary 値の NSArray があります。NSDictionay 構造は次のようになります。
ID = 22;
SERIESID = 33;
YEAREND = 2002;
YEARSTART = 1996;
配列にこれらの要素が十数個あります。同じSERIESIDを持つ要素をNSArray から削除する方法、または NSArray が既に作成された後にこれが可能かどうかを知りたいです。
どんな助けでも大歓迎です。
NSDictionary 値の NSArray があります。NSDictionay 構造は次のようになります。
ID = 22;
SERIESID = 33;
YEAREND = 2002;
YEARSTART = 1996;
配列にこれらの要素が十数個あります。同じSERIESIDを持つ要素をNSArray から削除する方法、または NSArray が既に作成された後にこれが可能かどうかを知りたいです。
どんな助けでも大歓迎です。
基本的に、配列を繰り返し処理し、確認した SERIESID を追跡します。現在の要素の SERIESID が重複している場合は、削除するようにマークします。
そのようです:
NSMutableSet *seen = [NSMutableSet set];
NSMutableIndexSet *toDelete = [NSMutableIndexSet indexSet];
[yourArray enumerateObjectsUsingBlock:^(id dict, NSUInteger i, BOOL *stop) {
if ([seen containsObject:dict[@"SERIESID"]]) {
[toDelete addIndex:i];
} else {
[seen addObject:dict[@"SERIESID"]];
}
}];
[yourArray removeObjectsAtIndexes:toDelete];
(ちなみに、最も直感的なアプローチではありませんが、この方法で削除を行う必要があります。NSMutableArray は、ループの途中で変更されるように設計されていないため、ループで使用しようとすると、エラーが発生removeObjectAtIndex:
します。そのため、削除するオブジェクトのリストを作成し、最後に配列に渡します。)
私はこれをテストしていませんが、次のようなことができます:
NSMutableArray *seriesHolder = [NSMutableArray alloc]init];
for(NSMutableDictionary *dict in yourMutableArray)
{
NSString *seriesID = [dict objectForKey:@"SERIESID"];
if(![seriesHolder containsObject:seriesID])
{
[seriesHolder addObject:seriesID];
}
else
{
[yourMutableArray removeObject:dict];
}
}
NSMutableSet
の使用済みの値を含む を作成しますSERIESID
。for
配列内のすべてのディクショナリに対してループを実行します。各ディクショナリを反復処理するときに、ディクショナリのSERIESID
キーのオブジェクトを確認します。セットにまだ存在しない場合は、追加します。すでに存在する場合は、配列からそのオブジェクトを削除します。反復が終了すると、配列内の の各値に対してオブジェクトが 1 つだけになりますSERIESID
。明らかにこれは、一意の辞書の最初のインスタンスSERIESID
が保持されることを意味することに注意してください。そのため、配列を反復処理する前に、実行可能な順序で辞書があることを確認してください。
これを達成するために必要な正確な方法について、より具体的な情報が必要な場合は、ドキュメントを参照してください。