2010-12-20 8 views
1

NSArrayの周りをナビゲートするのに少し問題があります。NSArray(またはNSMutableArray)の最大要素を見つける

マイ配列:

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

は私が "中央値" の要素を見つけましょうObjective-Cの内のいずれかの方法がありますか?この場合、「中央値」は「ElementA」、または最大回数が発生する値になります。

C#では、これは1回の呼び出しですが、Objective-Cで同等のものを見つけることができません。

多くのおかげで、 ブレット

+1

これは中央値ではありません。中央値は「平均値」と同義語です。あなたが探しているのは "モード"です。 –

答えて

3

はちょうどあなたのためにこれを書いた:)

- (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:私の解決策は動作しますがが、 upvote/accept @Dave DeLongの答えは、はるかに良いです。ここで

+1

うわー...深刻な名声!素晴らしいと思っていたよりずっと簡単です。本当にありがとう。 – Brett

0

はあなただけを使用できませんでした:

[myarray length] /2 
+0

は、2で割った要素の数を返します。私が探しているのは、最も発生した要素の値を示すメソッドです。この例では、値は「ElementA」になります。 – Brett

+0

申し訳ありません - 私はあなたが配列を並べ替えてからそれを行うことを意味しました。 – Brad

+0

このテクニックはすごく簡単です。 – arithma

8

は、私はそれを行うだろう方法は次のとおりです。

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); 

NSCountedSetもその要素が配列に追加された回数を覚えてNSMutableSetです。

+0

@Daveそのようなものがあることは分かっていましたが、見つけられませんでした!ニース! +1 –

+2

これは受け入れられる回答である必要があります。私のじゃない。 –

+0

これは 'NSString'だけでなく、どんなオブジェクトでも動作します。驚くばかり。 –

関連する問題