2012-09-01 10 views
5

Tengo una matriz llena de cadenas con cada cadena siendo un nombre. Algunos nombres pueden ser iguales, mientras que otros pueden ser diferentes. El lenguaje en el que estoy trabajando es objetivo-C. Deseo poder averiguar qué nombre es el más popular de esta matriz (la matriz será dinámica en función de la información que el usuario proporcione a la aplicación). No estoy seguro de cómo hacer que esto suceda EFICIENTEMENTE. Si alguien pudiera ampliar esto o dar un ejemplo, sería apreciado.Encontrar la mayoría de los objetos repetidos en la matriz

Gracias

Ejemplo:

NSArray *nameArray= [[NSArray alloc] initWithObjects @"james", @"megan", @"lauren", @"mike" @james", nil]; 

    //james would be the most popular name 

Respuesta

11

Uso NSCountedSet y luego encontrar el objeto con mayor conteo usando countForObject: método.

//create count set from array 
NSCountedSet *setOfObjects = [[NSCountedSet alloc] initWithArray:yourArrayhere]; 

//Declaration of objects 
NSString *mostOccurringObject = @""; 
NSUInteger highestCount = 0; 

//Iterate in set to find highest count for a object 
for (NSString *strObject in setOfObjects) 
{ 
    NSUInteger tempCount = [setOfObjects countForObject:strObject]; 
    if (tempCount > highest) 
    { 
     highestCount = tempCount; 
     mostOccurringObject = strObject; 
    } 
} 

Comprobación del resultado:

NSLog(@"Most frequent string: %@ with count: %i", mostOccurringObject,highestCount); 

crédito va a @Evan Mulawski respuesta

+0

aceptar o marcar responder si es útil? –

+0

No parece muy eficiente (como opio el op): apuesto a que cada '[bag countForObject:]' pasa por toda la matriz, y como lo haces para cada elemento de la matriz, es una O (n^2). El enfoque sugerido por @Samir se ve mejor. – Saphrosit

+0

También es igual que cada cadena en matriz se comprueba en matriz completa –

5

yo usaría una tabla hash (NSMutableDictionary en su caso), vaya a través de la matriz de cadenas, el uso cada cadena como clave, y establecer su valor como el número de sus ocurrencias en la matriz. Puede realizar un seguimiento del máximo utilizando una variable (o una matriz de nombres si hay varios nombres con el mismo número de apariciones).

El tiempo de ejecución es lineal (O (n) donde n es el número de nombres en su matriz).

+0

Prince proporcionó un ejemplo, por eso le di la marca de verificación. ¡He contestado porque también es correcto y gracias por brindarlo! –

0

Para obtener el número de apariciones.

NSArray *nameArray= [[NSArray alloc] initWithObjects @"james", @"megan", @"lauren", @"mike" @james", nil]; 
NSCountedSet *set = [[NSCountedSet alloc] nameArray]; 
Cuestiones relacionadas