2009-07-21 14 views
16

Actualmente estoy enumerando elementos NSMutableArray (o NSMutableSet) para buscar duplicados y eliminarlos.Crear NSMutableArray o NSMutableSet único

Por ejemplo, si la matriz/conjunto tiene valores [@"a", @"b", @"b", @"c"], el resultado final debería ser [@"a", @"b", @"c"].

Dado que estoy comparando NSStrings, estoy usando el método isEqualTo: para comprobar si las cadenas son iguales.

¿Hay una manera más eficiente de eliminar entradas duplicadas que recorrer todas y verificar si existe duplicado?

Respuesta

42

Un NSSet hace exactamente lo que estás tratando de hacer: es una colección (desordenada) de elementos únicos. Así, se pueden encontrar los artículos únicos en su conjunto, así:

NSSet *uniqueElements = [NSSet setWithArray:myArray]; 

// iterate over the unique items 
for(id element in uniqueElements) { 
    // do something 
} 

NSSet más probable es que utiliza un algoritmo de control para realizar la inserción O (1) (en comparación con O (n^2) para comprobar si cada elemento es único por iteración), pero la documentación de Apple no ofrece esa garantía, por lo que probablemente no debería contar con ese detalle de implementación.

Si, por algún motivo, necesita mantener los elementos únicos en una colección ordenada, puede volver a convertir el conjunto en una matriz con -[NSSet allObjects] y luego ordenar la matriz resultante.

+0

¡Gracias, eso funcionó! Hice esto para obtener elementos únicos en la matriz: // agregar al conjunto para verificar los nombres de elementos únicos NSSet * uniqueNames = [NSSet setWithArray: names]; \t // devolver los datos a la matriz names = [[NSMutableArray alloc] initWithArray: [uniqueNames allObjects]]; – Rudi

+0

La forma más canónica de volver a los nombres de la matriz sería: id names = [[uniqueNames allObjects] retain]; // si desea conservar los nombres o id names = [uniqueNames allObjects]; // si no desea conservar la propiedad de la matriz –

+0

@BarryWark, ¿no sería O (n) para la iteración? – Peres

3

Un conjunto nunca contiene elementos duplicados, por lo que la simple creación de un NSMutableSet debe garantizar la exclusividad de los valores.

+0

Gracias por la respuesta Daniel! – Rudi

4

Un NSSet o NSMutableSet garantizará que no tenga objetos duplicados. Funcionará para NSStrings como en su ejemplo, pero para sus propias clases, tenga en cuenta lo que quiere decir con "igual" e implemente los métodos hash y isEqual: según corresponda.

+0

Gracias por la explicación, es bueno saber que es automático para NSStrings. – Rudi

1

Solo esta línea de código funcionará bien.

NSSet *mySet = [NSSet setWithArray:myArray]; 

ahora mySet tendrá elementos únicos.

Cuestiones relacionadas