2012-09-01 15 views
5

Mam tablicę pełną ciągów znaków, z których każdy jest nazwą. Niektóre nazwy mogą być takie same, a niektóre mogą być inne. Język, w którym pracuję, jest obiektywny-C. Chcę być w stanie dowiedzieć się, która nazwa jest najbardziej popularna z tej tablicy (tablica będzie dynamiczna w oparciu o informacje podane aplikacji od użytkownika). Nie jestem pewien, jak to zrobić WYDAJNIE. Jeśli ktoś mógłby rozwinąć ten temat lub podać przykład, byłoby to docenione.Znajdowanie najbardziej powtarzanego obiektu w tablicy

Dziękuję

Przykład:

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

    //james would be the most popular name 

Odpowiedz

11

Korzystając NSCountedSet a następnie znaleźć obiekt z najwyższą liczbą wykorzystaniem countForObject: metody.

//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; 
    } 
} 

Sprawdzanie wynik:

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

Credit idzie @Evan Mulawski odpowiedź

+0

akceptować lub zaznaczać odpowiedź, jeśli jest to pomocne? –

+0

Nie wygląda bardzo efektywnie (jak op zapytał): Założę się, że każdy '[bag countForObject:]' przechodzi przez całą tablicę, a ponieważ robisz to dla każdego elementu tablicy, to jest to O (n^2). Podejście sugerowane przez @Samir wygląda lepiej. – Saphrosit

+0

to samo co każdy ciąg w tablicy jest sprawdzany w całej tablicy –

5

użyłbym stolik hash (NSMutableDictionary w Twoim przypadku), przejść przez tablicę łańcuchów, użytkowania każdy ciąg jako klucz i ustaw jego wartość jako liczbę jego wystąpień w tablicy. Możesz śledzić maksimum za pomocą zmiennej (lub tablicy nazw, jeśli istnieje wiele nazw o tej samej liczbie wystąpień).

Czas pracy jest wówczas liniowy (O (n), gdzie n to liczba nazw w twojej tablicy).

+0

Książę podał przykład, dlatego nadałem mu znacznik wyboru. Otrzymałem odpowiedź, ponieważ jest ona również poprawna i dziękuję za jej dostarczenie! –

0

Aby uzyskać liczbę wystąpień.

NSArray *nameArray= [[NSArray alloc] initWithObjects @"james", @"megan", @"lauren", @"mike" @james", nil]; 
NSCountedSet *set = [[NSCountedSet alloc] nameArray]; 
Powiązane problemy