web-dev-qa-db-ja.com

NSArray +配列からアイテムを削除

NSArrayからアイテムを削除する方法。

43
pratik

NSArrayは可変ではありません。つまり、変更することはできません。 NSMutableArray をご覧ください。 「オブジェクトの削除」セクションを参照してください。アイテムを削除できる多くの機能があります。

[anArray removeObjectAtIndex: index];
[anArray removeObject: item];
[anArray removeLastObject];
123
luvieere
NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array];

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index];

[your_array release];

 your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain];

それはそれについてです

your_arrayを所有していない場合(つまり自動リリースされている場合)、リリースを削除してメッセージを保持します。

24
ahmet emrah

このカテゴリはあなたの好みに合うかもしれません。しかし!その使用法にはfru約しないでください。 NSMutableArrayに変換してから再び変換するため、まったく効率的ではありません。

@implementation NSArray (mxcl)

- (NSArray *)arrayByRemovingObject:(id)obj
{
    if (!obj) return [self copy]; // copy because all array* methods return new arrays
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self];
    [mutableArray removeObject:obj];
    return [NSArray arrayWithArray:mutableArray];
}

@end
20
mxcl

Key-Value Codingを使用したより機能的なアプローチを次に示します。

@implementation NSArray (Additions)

- (instancetype)arrayByRemovingObject:(id)object {
    return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]];
}

@end
18

このメソッドでObjectからNSArrayを削除します。

-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index {
    NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array];
    [modifyableArray removeObjectAtIndex:index];
    return [[NSArray alloc] initWithArray:modifyableArray];
}
3
Kai Burghardt

Mxclのようなカテゴリを作成しましたが、これはわずかに高速です。

私のテストでは、約15%の改善が見られました(間違っている可能性がありますので、自分で2つを比較してください)。

基本的に、オブジェクトの前にある配列の部分と後ろにある部分を取り、それらを結合します。したがって、要素を除外します。

- (NSArray *)prefix_arrayByRemovingObject:(id)object 
{
    if (!object) {
        return self;
    }

    NSUInteger indexOfObject = [self indexOfObject:object];
    NSArray *firstSubArray = [self subarrayWithRange:NSMakeRange(0, indexOfObject)];
    NSArray *secondSubArray = [self subarrayWithRange:NSMakeRange(indexOfObject + 1, self.count - indexOfObject - 1)];
    NSArray *newArray = [firstSubArray arrayByAddingObjectsFromArray:secondSubArray];

    return newArray;
}
3
jmathew

他の人が示唆したように、NSMutableArrayにはそうするためのメソッドがありますが、時にはNSArrayを使用せざるを得ないことがあります。

NSArray* newArray = [oldArray subarrayWithRange:NSMakeRange(1, [oldArray count] - 1)];

このように、oldArrayはそのまま残りますが、newArrayは最初のアイテムが削除されて作成されます。

0
MyFlashLab