2011-06-21 9 views
14

Tengo una matriz mutable vacía. ¿Es posible insertar objetos en el índice 2, por ejemplo, mientras que no hay nada en el índice 0 y 1? Me refiero a aumentar la capacidad de forma dinámica o algo así. .Saludos.NSMutableArray insertar objeto en el índice

+1

Hmm ¿Por qué quieres hacer eso? :) – Mikael

+2

Lo necesito para mi mini proyecto en la universidad.:) – GeRyCh

Respuesta

40

NSMutableArray no es una matriz dispersa; no permite ranuras vacías que pueden rellenarse más tarde. initWithCapacity: solo indica a la matriz que se llenará hasta una cierta cantidad; generalmente no es necesario en la práctica y, a menos que sepa exactamente cuántos elementos va a meter en el conjunto, no se moleste en llamarlo (solo use init).

Una matriz mutable crecerá de manera bastante eficiente a medida que se agreguen los objetos.

Si necesita una estructura de datos que admita "agujeros", entonces use algo diferente o coloque un objeto marcador en las ranuras que se supone que están vacías.

I.e. si quería una matriz con 10 ranuras, es posible hacer:

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

entonces usted puede comprobar si el objeto recuperado isEqual: [NSNull null] para saber si la ranura está vacía o no. Y puede usar replaceObjectAtIndex:withObject: para pegar un objeto en un índice específico.

O podría utilizar una estructura de datos diferente; un diccionario con los índices como las teclas funcionarían, por ejemplo.

+0

Puede agregar un par de métodos de categoría para anexar automáticamente objetos 'NSNull' según sea necesario y verificar si un elemento es el objeto nulo y devuelve nil en su lugar. Así es como lo hice: http://cutecoder.org/programming/behold-holy-array/ – adib

11

Puede usar un NSPointerArray para eso.

NSPointerArray es una colección mutable modelado después NSArray pero también puede contener valores NULL, que pueden ser inserta o extrae (y que contribuyen a la cuenta del objeto). Además, a diferencia de las matrices tradicionales, , puede establecer el recuento de la matriz directamente.


NSPointerArray está disponible en OS X v10.5 y posterior y iOS 6.0 y versiones posteriores. Si se dirige a una versión anterior del sistema operativo se puede, por ejemplo:

  • Utilice un NSMutableDictionary, en que se coloca en los índices NSNumber s y utilizar estos como claves.

  • Usa un NSMutableArray y llena los "agujeros" con NSNull objetos.

+0

Sí; Debería haber mencionado esto. ¡NSPointerArray es una clase tremendamente útil! Sin embargo, NSPointerArray no está disponible en iOS IIRC. – bbum

+1

cierto. Verifiqué si la pregunta estaba etiquetada como iOS, pero dado que no es ... – albertamg

+1

NSPointerArray está disponible para iOS 6 y versiones posteriores. – quellish

2

Escriba usted mismo una clase SparseArray usando un NSMutableDictionary subyacente. Algo como esto (código mínimo, apenas probado, pero debería darle la 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 
+2

Desafortunadamente, este objeto no admite la enumeración rápida. Incluso si lo agregó al adoptar 'NSFastEnumeration', la implementación sería muy ineficiente o no garantizaría que se ordenara la enumeración (como se esperaría de un objeto de matriz). – jhabbott

Cuestiones relacionadas