2010-12-20 8 views
1

Ich habe ein wenig Probleme beim Navigieren um eine NSArray.Suchen der maximalen Elemente in einem NSArray (oder NSMutableArray)

Mein Array:

Element[0] = "ElementA" 
Element[1] = "ElementA" 
Element[2] = "ElementA" 
Element[3] = "ElementA" 
Element[4] = "ElementB" 
Element[5] = "ElementC" 

Gibt es Methoden, in Objective-C, die mir das "mittlere" Element finden helfen? In diesem Fall wäre der "Median" "ElementA" oder der Wert, der die maximale Anzahl von Malen auftritt.

In C# wäre dies ein einzelner Aufruf, aber ich finde keine Entsprechung in Objective-C.

Vielen Dank, Brett

+1

Das ist nicht der Median. Median ist gleichbedeutend mit "durchschnittlich". Was Sie suchen, ist der "Modus". –

Antwort

3

das für Sie gerade geschrieben :)

- (NSString *) findModeString: (NSArray *) array { 
    NSMutableDictionary *stats = [[NSMutableDictionary alloc] init]; 
    for(NSString *str in array) { 
     if(![stats objectForKey:str]) { 
     [stats setObject: [NSNumber numberWithInt:1] forKey:str]; 
     } else { 
     [stats setObject: [NSNumber numberWithInt:[[stats objectForKey:str] intValue] + 1] forKey:str]; 
     } 
    } 
    NSInteger maxOccurrences = 0; 
    NSString *max; 
    for(NSString *key in stats) { 
     if([[stats objectForKey:key] intValue] > maxOccurrences) { 
     max = key; 
     maxOccurrences = [[stats objectForKey:key] intValue]; 
     } 
    } 
    [stats release]; 
    return max; 
} 

EDIT: Obwohl meine Lösung funktioniert, Sie sollten die Antwort @Dave DeLong upvote/accept, es ist viel viel besser.

+1

Wow ... ernsthafte Anerkennung! Super und viel einfacher als ich erwartet hatte. Vielen Dank. – Brett

0

Könnten Sie nicht benutzen Sie einfach:

[myarray length] /2 
+0

das würde mir die Anzahl der Elemente geteilt durch 2 geben. Was ich suche ist eine Methode, die mir den Wert des am meisten aufgetretenen Elements zeigt. In diesem Beispiel wäre der Wert "ElementA". – Brett

+0

Entschuldigung - ich meinte - Sie sortieren das Array und tun das dann. – Brad

+0

Diese Technik ist solide und einfach. – arithma

8

Hier ist, wie ich es tun würde:

NSArray * elements = ...; //your array of elements: 
NSCountedSet * counts = [NSCountedSet setWithArray:elements]: 
id modeObject = nil; 
NSUInteger modeCount = 0; 
for (id element in counts) { 
    if ([counts countForObject:element] > modeCount) { 
    modeCount = [counts countForObject:element]; 
    modeObject = element; 
    } 
} 

NSLog(@"element with highest frequency: %@", modeObject); 

Ein NSCountedSet ist ein NSMutableSet, die auch erinnert, wie oft ihre Elemente zum Array hinzugefügt wurden.

+0

@Dave Ich wusste, dass es so etwas gab, aber ich konnte es nicht finden! Nett! +1 –

+2

Dies sollte die akzeptierte Antwort sein. Nicht mein. –

+0

Dies funktioniert mit jedem Objekt, nicht nur 'NSString'. Genial. –

Verwandte Themen