2011-06-21 41 views
14

Tôi có một mảng trống có thể thay đổi. Có thể chèn đối tượng tại chỉ mục 2 chẳng hạn, trong khi không có gì ở chỉ mục 0 và 1 không? Tôi có nghĩa là để tăng năng lực động hoặc một cái gì đó như thế. .Trân trọng.NSMutableArray chèn đối tượng tại chỉ số

+1

Hmm lý do tại sao bạn sẽ muốn làm điều đó? :) – Mikael

+2

Tôi cần nó cho dự án mini của tôi ở trường đại học.:) – GeRyCh

Trả lời

40

NSMutableArray không phải là mảng thưa thớt; nó không cho phép các vùng trống có thể được điền sau này. initWithCapacity: chỉ gợi ý cho mảng rằng nó sẽ được lấp đầy với một số tiền nhất định; nó không phải là cần thiết trong thực tế và, trừ khi bạn biết chính xác có bao nhiêu mục bạn sẽ xô trong mảng, đừng bận tâm gọi nó (chỉ cần sử dụng init).

Mảng có thể thay đổi sẽ phát triển khá hiệu quả khi kích thước đối tượng được thêm vào.

Nếu bạn cần cấu trúc dữ liệu hỗ trợ "lỗ", thì hãy sử dụng thứ gì đó khác hoặc đặt đối tượng giữ chỗ trong các vị trí được cho là trống.

I.e. nếu bạn muốn có một mảng với 10 khe cắm, bạn có thể làm:

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

Sau đó bạn có thể kiểm tra nếu đối tượng lấy isEqual: [NSNull null] biết nếu các khe trống hay không. Và bạn có thể sử dụng replaceObjectAtIndex:withObject: để gắn một đối tượng vào một chỉ mục cụ thể.

Hoặc bạn có thể sử dụng cấu trúc dữ liệu khác; một từ điển với các chỉ mục như các phím sẽ hoạt động, ví dụ.

+0

Bạn có thể thêm một vài phương thức thể loại để tự động nối thêm các đối tượng 'NSNull' khi cần và kiểm tra xem một phần tử là đối tượng null và trả về nil thay thế. Đây là cách tôi đã làm nó: http://cutecoder.org/programming/behold-holy-array/ – adib

11

Bạn có thể sử dụng NSPointerArray cho điều đó.

NSPointerArray là một bộ sưu tập có thể thay đổi mô hình sau NSArray nhưng nó cũng có thể giữ các giá trị NULL, mà có thể là chèn hoặc chiết xuất (và đó góp phần count của đối tượng). Hơn nữa, không giống như các mảng truyền thống, bạn có thể đặt số đếm của mảng trực tiếp.


NSPointerArray có sẵn trong OS X v10.5 và sau đó và iOS 6.0 và sau này. Nếu bạn nhắm mục tiêu một phiên bản thấp hơn hệ điều hành bạn có thể, ví dụ:

  • Sử dụng một NSMutableDictionary, quấn bạn chỉ số thành NSNumber s và sử dụng các phím như.

  • Sử dụng NSMutableArray và điền vào "lỗ" với các đối tượng NSNull.

+0

Yup; Tôi nên đề cập đến điều này. NSPointerArray là một lớp học rất hữu ích! Tuy nhiên, NSPointerArray không khả dụng trên iOS IIRC. – bbum

+1

Đúng. Tôi đã kiểm tra xem câu hỏi đã được gắn thẻ iOS hay chưa nhưng vì nó không phải là ... – albertamg

+1

NSPointerArray có sẵn trên iOS 6 trở lên. – quellish

2

Tự viết cho mình một lớp SparseArray sử dụng NSMutableDictionary cơ bản. Một cái gì đó như thế này (mã tối thiểu, hầu như không được kiểm tra, nhưng nó sẽ cho bạn ý tưởng).

@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

Thật không may, đối tượng này không hỗ trợ liệt kê nhanh. Thậm chí nếu bạn đã thêm nó bằng cách chấp nhận 'NSFastEnumeration', việc thực thi sẽ rất kém hiệu quả hoặc sẽ không đảm bảo việc liệt kê sẽ được sắp xếp (như bạn mong đợi từ một đối tượng mảng). – jhabbott

Các vấn đề liên quan