Potrebbe essere utile per la sua attuazione mediante una serie di specificare gli oggetti da trovare, come ad esempio:
- (NSIndexSet *) indicesOfObjectsInSet: (NSSet *) set
{
if ([set count] == 0)
return ([NSIndexSet indexSet]);
NSMutableIndexSet * indices = [NSMutableIndexSet indexSet];
NSUInteger index = 0;
for (id obj in self)
{
if ([set containsObject: obj])
[indices addIndex: index];
index++;
}
return ([[indices copy] autorelease]);
}
Ciò richiede la visita ogni oggetto nella matrice, ma almeno solo lo fa una volta e fa uso di enumerazione rapida mentre lo fa. L'utilizzo di un NSSet e il test di ogni oggetto nell'array rispetto a quel set è anche molto più veloce del test per l'inclusione in un array.
C'è un potenziale di ottimizzazione qui, ma sarebbe svolta nel caso in cui un singolo oggetto viene memorizzato nella matrice di ricezione più volte:
if ([set containsObject: obj])
{
[indices addIndex: index];
if ([indices count] == [set count])
break;
}
In questo modo se si esegue la scansione di una 20'000-item array per due oggetti e sono entrambi all'interno dei primi dieci, sarete in grado di evitare la scansione degli altri 19'990 oggetti nell'array. Come ho detto, però, questo non aiuta se l'array contiene duplicati, perché si fermerà non appena troverà 2 indici (anche se entrambi puntano allo stesso oggetto).
Detto questo, sono d'accordo con il commento di Mike sopra. È probabile che ti stai preparando per un po 'di dolore, l'ottimizzazione-tempo. Potrebbe valere la pena di pensare a diversi tipi di dati; per esempio, mentre NSArray sembra la scelta più logica per un semplice contenitore piatto, se non hai realmente bisogno delle informazioni per l'ordinazione, è preferibile utilizzare un NSSet; questo ha il vantaggio aggiunto che non memorizzerà lo stesso oggetto (calcolato usando -isEqual:
) due volte. Se si desidera tenere traccia dei duplicati, ma non è necessario ordinare, è possibile utilizzare NSCountedSet, che si comporta come NSSet tranne che tiene traccia di quante volte ogni oggetto è stato aggiunto/rimosso senza effettivamente memorizzare i duplicati.
fonte
2009-05-31 14:37:33
+1 Solo una nota minore: sia "indici" che "indici" sono corretti in inglese, ma Cocoa usa sempre "indici", quindi è meglio attenersi a quella terminologia, almeno per il nome del metodo. –