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
Odpowiedz
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.
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
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 wNSNumber
s i używać ich jako kluczy.Użyj
NSMutableArray
i wypełnij "otwory" obiektamiNSNull
.
Yup; Powinienem to wspomnieć. NSPointerArray to niesamowicie przydatna klasa! Jednak NSPointerArray nie jest dostępny w iOS IIRC. – bbum
Prawda. Sprawdziłem, czy pytanie zostało oznaczone jako iOS, ale ponieważ nie jest ... – albertamg
NSPointerArray jest dostępny na iOS 6 i nowszych. – quellish
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
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
- 1. Obserwacja obiektu NSMutableArray do wstawiania/usuwania
- 2. Usuwanie ostatniego obiektu w NSMutablearray
- 3. jak dodać obiekt do NSMutableArray
- 4. Get element obiektu JS z indeksem
- 5. Jak dodać NSMutableArray do obiektu NSMutableArray Objective-c
- 6. R, wektor podziału pod nieznanym indeksem
- 7. cel-c: Jak zaktualizować obiekt w NSMutableArray?
- 8. Jak utworzyć obiekt NSMutableArray i przypisać do niego określony obiekt?
- 9. Równoważnik NSMutableArray w C++?
- 10. Pobranie ostatnich obiektów x z obiektu NSMutableArray
- 11. Jak usunąć wszystkie obiekty z obiektu NSMutableArray?
- 12. Jak usunąć tylko jedną instancję obiektu z obiektu NSMutableArray?
- 13. dostać obiektów w NSMutableArray
- 14. Qt QFileSystemModel - Wiele drzew katalogów pod głównym indeksem
- 15. NSMutableArray jest pusty po addObject
- 16. Sortuj NSMutableArray z obiektami niestandardowymi za pomocą innego NSMutableArray
- 17. Wymuszenie zwolnienia obiektu pod ARC
- 18. JSON zwraca [obiekt obiektu]
- 19. Handlebars.js parsować obiekt zamiast [Obiekt obiektu]
- 20. Jak iterować obiekt w javascript z nieuporządkowanym indeksem
- 21. Czy removeObject zwalnia obiekt w obiekcie NSMutableArray obiektów?
- 22. Jak sortować obiekt NSMutableArray obiektów zarządzanych za pomocą wykresu obiektów
- 23. Różnica między rzadkim indeksem a gęstym indeksem
- 24. JSON.stringify zwraca "[obiekt obiektu]" zamiast zawartości obiektu
- 25. Połącz jedną NSMutableArray z końcem innej NSMutableArray
- 26. NSMutableSet vs NSMutableArray
- 27. IEnumerable.Select indeksem
- 28. Resetowanie NSMutableArray
- 29. obiekt-c "metoda mutacji wysłana do niezmiennego obiektu" błąd
- 30. Swift pobiera określony obiekt NSManagedObject z obiektu (dane podstawowe)
Hmm dlaczego chcesz to zrobić? :) – Mikael
Potrzebuję tego do mojego mini projektu na uniwersytecie.:) – GeRyCh