Ho una matrice mutabile vuota. È possibile inserire oggetti nell'indice 2, ad esempio, mentre non c'è nulla nell'indice 0 e 1? Intendo aumentare la capacità in modo dinamico o qualcosa di simile. .Saluti.NSMutableArray insert object all'indice
risposta
NSMutableArray
non è un array sparse; non consente slot vuoti che possono essere compilati in seguito. initWithCapacity:
solo suggerimenti per l'array che verrà riempito per un determinato importo; in genere non è necessario in pratica e, a meno che tu non sappia esattamente quanti oggetti stai andando a spingere nell'array, non preoccuparti di chiamarlo (usa solo init
).
Un array mutabile si ingrandirà in modo efficiente in termini di dimensioni con l'aggiunta di oggetti.
Se è necessaria una struttura dati che supporti "buchi", quindi utilizzare qualcos'altro o inserire un oggetto segnaposto negli slot che si suppone siano vuoti.
I.e. se si voleva una matrice con 10 slot, si potrebbe fare:
NSMutableArray *a = [NSMutableArray array];
for(int i = 0; i<10; i++) [a addObject: [NSNull null]];
si può quindi controllare se l'oggetto recuperato isEqual: [NSNull null]
per sapere se lo slot è vuoto o no. Ed è possibile utilizzare replaceObjectAtIndex:withObject:
per attaccare un oggetto a un indice specifico.
Oppure è possibile utilizzare una diversa struttura dati; per esempio un dizionario con gli indici come funzionano le chiavi.
È possibile aggiungere un paio di metodi di categoria per aggiungere automaticamente gli oggetti 'NSNull' secondo necessità e controllare se un elemento è l'oggetto nullo e restituire invece nil. Ecco come l'ho fatto: http://cutecoder.org/programming/behold-holy-array/ – adib
È possibile utilizzare uno NSPointerArray per quello.
NSPointerArray è una raccolta mutevole modellato NSArray ma può anche contenere valori NULL, che può essere inserita o estratta (e che contribuiscono al conteggio dell'oggetto). Inoltre, a differenza degli array tradizionali, è possibile impostare direttamente il conteggio dell'array .
NSPointerArray
è disponibile in OS X v10.5 e versioni successive e iOS 6.0 e versioni successive. Se il target una versione inferiore del sistema operativo è possibile, ad esempio:
Utilizzare un
NSMutableDictionary
, si avvolge indici inNSNumber
s e utilizzarli come chiavi.Utilizzare un
NSMutableArray
e riempire i "buchi" con gli oggettiNSNull
.
Yup; Avrei dovuto accennare a questo. NSPointerArray è una classe incredibilmente utile! Tuttavia, NSPointerArray non è disponibile su iOS IIRC. – bbum
Vero. Ho controllato se la domanda è stata taggata iOS ma poiché non è ... – albertamg
NSPointerArray è disponibile su iOS 6 e versioni successive. – quellish
Scrivi te una classe SparseArray utilizzando un NSMutableDictionary sottostante. Qualcosa di simile (codice minimo, appena testato, ma dovrebbe darti l'idea).
@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
Sfortunatamente, questo oggetto non supporta l'enumerazione veloce. Anche se lo si fosse aggiunto adottando 'NSFastEnumeration', l'implementazione sarebbe stata molto inefficiente o non avrebbe garantito che l'enumerazione sarebbe stata ordinata (come ci si aspetterebbe da un oggetto array). – jhabbott
- 1. NSMutableArray alloc init vs matrice NSMutableArray
- 2. NSMutableArray è vuoto dopo addObject
- 3. Ripristino NSMutableArray
- 4. NSMutableArray removeObjectAtIndex
- 5. Equivalente di NSMutableArray in C++?
- 6. Raccolta NSMutableArray e blocchi @Synchronized
- 7. .NET Entity Framework Insert vs Bulk Insert
- 8. Come aggiungereObject come NSMutableArray in NSMutableArray in swift
- 9. Concatena un NSMutableArray alla fine di un altro NSMutableArray
- 10. Come aggiungere un NSMutableArray a un NSMutableArray Objective-c
- 11. OleDB errore di comando INSERT
- 12. Rimozione oggetto da NSMutableArray
- 13. NSMutableSet vs NSMutableArray
- 14. NSMutableArray - rimuovere i duplicati
- 15. NSMutableArray -init vs. + arrayWithCapacity:
- 16. NSMutableArray arrayWithCapacity vs initWithCapacity
- 17. Subarray from NSMutableArray
- 18. NSMutableArray removeObjectAtIndex strano problema.
- 19. NSMutableArray removeObjectAtIndex causa errore
- 20. NSMutableArray addObject non funzionante
- 21. Dimensione totale dell'oggetto NSMutableArray
- 22. NSMutableArray ordinamento - case insensitive
- 23. Salva NSMutableArray su disco
- 24. NSMutableArray initWithCapacità sfumature
- 25. NSMutableArray removeLastObject eccezione
- 26. Calendar.before (Object when), why Object?
- 27. Perché Object()! = Object() in JavaScript?
- 28. Uncaught TypeError: Object [object Object] non ha un metodo 'live'
- 29. È delete (Object) equivalente a chiamare Object. ~ Object()
- 30. Sintassi dell'istruzione SQL Insert
Hmm Perché dovresti desiderare di farlo? :) – Mikael
Ne ho bisogno per il mio mini progetto all'università.:) – GeRyCh