2011-06-21 12 views
14

Mam pustą tablicę zmiennych. Czy można wstawić obiekt na przykład w indeksie 2, podczas gdy w indeksie 0 i 1 nie ma nic? Mam na myśli dynamiczne zwiększanie wydajności lub coś w tym stylu. .Pozdrowienia.Obiekt wstawiania obiektu NSMutableArray pod indeksem

+1

Hmm dlaczego chcesz to zrobić? :) – Mikael

+2

Potrzebuję tego do mojego mini projektu na uniwersytecie.:) – GeRyCh

Odpowiedz

40

NSMutableArray nie jest rzadką tablicą; nie pozwala na puste miejsca, które można później wypełnić. initWithCapacity: po prostu podpowiada tablicy, że zostanie wypełniona do pewnej kwoty; nie jest to zwykle konieczne w praktyce i, o ile nie wiesz dokładnie, ile elementów zamierzasz wcisnąć do tablicy, nie zawracaj sobie głowy wywoływaniem (po prostu użyj init).

Zmienna tablica będzie dość efektywnie rosnąć w miarę dodawania obiektów.

Jeśli potrzebujesz struktury danych obsługującej "dziury", użyj albo czegoś innego albo umieść obiekt zastępczy w gniazdach, które powinny być puste.

tj. gdybyś chciał tablicę z 10 szczelin, można zrobić:

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

Następnie można sprawdzić, czy otrzymany obiekt isEqual: [NSNull null] wiedzieć, czy gniazdo jest puste lub nie. I możesz użyć replaceObjectAtIndex:withObject:, aby przykleić obiekt do określonego indeksu.

Albo możesz użyć innej struktury danych; słownik z indeksami, jak na przykład klawisze.

+0

Możesz dodać kilka metod kategorii, aby automatycznie dołączyć obiekty 'NSNull' w razie potrzeby i sprawdzić, czy element jest obiektem zerowym i zamiast tego zwraca zero. Tak to zrobiłem: http://cutecoder.org/programming/behold-holy-array/ – adib

11

Możesz użyć do tego celu NSPointerArray.

NSPointerArray jest zmienny zbiór wzorowane NSArray ale może również przechowywania wartości NULL, które mogą być umieszczenia lub wyjęcia (i które przyczyniają się do liczby obiektu). Ponadto, w przeciwieństwie do tradycyjnych tablic, możesz ustawić liczbę macierzy bezpośrednio.


NSPointerArray jest dostępny w OS X 10.5 i nowsze oraz iOS 6.0 i nowszych. Jeśli kierujesz mniejszą wersję systemu operacyjnego można na przykład:

  • użyć NSMutableDictionary, zawinąć Cię indeksy w NSNumber s i używać ich jako kluczy.

  • Użyj NSMutableArray i wypełnij "otwory" obiektami NSNull.

+0

Yup; Powinienem to wspomnieć. NSPointerArray to niesamowicie przydatna klasa! Jednak NSPointerArray nie jest dostępny w iOS IIRC. – bbum

+1

Prawda. Sprawdziłem, czy pytanie zostało oznaczone jako iOS, ale ponieważ nie jest ... – albertamg

+1

NSPointerArray jest dostępny na iOS 6 i nowszych. – quellish

2

Napisz sobie klasę SparseArray używając bazowego NSMutableDictionary. Coś takiego (minimalny kod, ledwo przetestowany, ale powinien dać ci pomysł).

@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

Niestety ten obiekt nie obsługuje szybkiego wyliczania. Nawet jeśli dodałeś to, przyjmując 'NSFastEnumeration', implementacja byłaby albo bardzo nieefektywna, albo nie gwarantowałaby wyliczenia wyliczeń (jak można oczekiwać od obiektu tablicy). – jhabbott

Powiązane problemy