2011-06-21 5 views
14

私は空の可変配列を持っています。たとえば、インデックス0と1に何もないのに、インデックス2にオブジェクトを挿入することは可能ですか?容量を動的に増やすなどのことです。 。NSMutableArrayはインデックスにオブジェクトを挿入します

+1

うーん、なぜあなたはそれを行うたいでしょうか? :) – Mikael

+2

私は大学で私のミニプロジェクトに必要です。:) – GeRyCh

答えて

40

NSMutableArrayはスパース配列ではありません。後で入力できる空のスロットは許可されません。 initWithCapacity:は、配列に特定の量まで塗りつぶされることを示唆しています。実際には実際には必要ではありません。配列内で押し込むアイテムの数を正確に把握していない場合は、呼び出すのをやめてください(ちょうどinitを使用してください)。

オブジェクトが追加されると、変更可能な配列のサイズがかなり大きくなります。

「穴」をサポートするデータ構造が必要な場合は、何か他のものを使用するか、空であるはずのスロットにプレースホルダオブジェクトを配置します。

I.e.あなたは10個のスロットを持つ配列を望んでいた場合、あなたが行う可能性があります:

NSMutableArray *a = [NSMutableArray array]; 
for(int i = 0; i<10; i++) [a addObject: [NSNull null]]; 

をあなたはその後、スロットが空であるかどうかを知るために取得したオブジェクトisEqual: [NSNull null]かどうかを確認することができます。 replaceObjectAtIndex:withObject:を使用すると、特定のインデックスにオブジェクトを貼り付けることができます。

また、別のデータ構造を使用することもできます。索引をキーとする辞書が機能します。

+0

必要に応じて 'NSNull'オブジェクトを自動的に追加し、要素がnullオブジェクトで、代わりにnilを返すかどうかをチェックするために、いくつかのカテゴリメソッドを追加できます。これは私がそれをした方法です:http://cutecoder.org/programming/behold-holy-array/ – adib

11

これにはNSPointerArrayを使用できます。

NSPointerArrayはNSArrayの後にモデル化された可変コレクション であるが、それはまた は、挿入または抽出することができるNULL値を保持することができ(かつ 、オブジェクトのカウントに寄与する)。 また、従来のアレイと異なり、 アレイの数を直接設定することができます 。


NSPointerArray OS X 10.5以降とiOS 6.0以降で利用可能です。あなたがたとえば、することができます下のOSのバージョンをターゲットにする場合:

  • NSMutableDictionaryを使用して、あなたにNSNumber Sのインデックスをラップし、キーとしてこれらを使用します。

  • NSMutableArrayを使用し、「穴」にNSNullオブジェクトを記入してください。

+0

はい。私はこれを言及すべきだった。 NSPointerArrayはすごく便利なクラスです!ただし、NSPointerArrayはiOS IIRCでは使用できません。 – bbum

+1

真。質問がiOSにタグ付けされているかどうかを確認しましたが、それはそうではありませんでした。 – albertamg

+1

NSPointerArrayはiOS 6以降で利用できます。 – quellish

2

NSMutableDictionaryを使用してSparseArrayクラスを作成します。このようなもの(最小限のコード、ほとんどテストされていませんが、それはあなたにアイデアを与えるべきです)。

@interface SparseArray : NSObject { 

@private 
    NSMutableDictionary* _dict; 
    int count; 
} 

-(SparseArray*)initWithCapacity:(NSUInteger)anInt; 
-(id)objectAtIndex:(int)anIndex; 
-(void)insertObject:(id)anObject atIndex:(int)anIndex; 
- (void)removeObjectAtIndex:(int)anIndex; 
-(int)count; 

@implementation SparseArray 

-(SparseArray*)initWithCapacity:(NSUInteger)anInt { 

    if ((self = [super init])) { 
    _dict = [[NSMutableDictionary dictionaryWithCapacity:anInt] retain]; 
    count = 0; 

    } 
    return self; 
} 

-(id)objectAtIndex:(int)anIndex { 

    NSNumber* key = [NSNumber numberWithInt:anIndex]; 
    id object = [_dict objectForKey:key]; 
    return object; 
} 

-(void)insertObject:(id)anObject atIndex:(int)anIndex { 

    NSNumber* key = [NSNumber numberWithInt:anIndex]; 
    [_dict setObject:anObject forKey:key]; 
    count++; 

} 

- (void)removeObjectAtIndex:(int)anIndex { 

    NSNumber* key = [NSNumber numberWithInt:anIndex]; 
    id object = [_dict objectForKey:key]; 
    if (object) { 
    [_dict removeObjectForKey:key]; 
    count--; 
    } 
} 

-(int)count { 

    return count; 
} 

-(void)dealloc { 

    [_dict release]; 
    [super dealloc]; 
} 

@end 
+2

残念ながら、このオブジェクトは高速列挙をサポートしていません。 NSFastEnumerationを実装して追加したとしても、実装は非常に非効率的であるか、列挙が順序付けされることを保証しません(配列オブジェクトから期待されるように)。 – jhabbott

関連する問題