2012-09-01 32 views
5

我有一個數組,每個字符串都是一個名稱。有些名字可能相同,有些可能不同。我正在使用的語言是Objective-C。我希望能夠從這個數組中找出哪個名字是最受歡迎的(該數組將根據用戶嚮應用程序提供的信息進行動態變化)。我不知道如何高效地做到這一點。如果有人可以擴大或提供一個例子,它將不勝感激。查找數組中的大部分重複對象

謝謝

例子:

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

    //james would be the most popular name 

回答

11

使用NSCountedSet,然後找到使用countForObject:法最高計數的對象。

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

檢查結果:

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

信用@Evan Mulawski答案

+0

接受或勾選答案如果有幫助? –

+0

看起來效率不高(正如op所問):我敢打賭,每個'[bag countForObject:]'都會遍歷整個數組,並且因爲您爲數組的每個元素執行操作,所以它是O(n^2)。 @Samir建議的方法看起來更好。 – Saphrosit

+0

它也與整個數組中檢查數組中的每個字符串相同 –

5

我會用一個哈希表(NSMutableDictionary你的情況),經過字符串數組,使用每個字符串作爲關鍵字,並將其值設置爲數組在其中的出現次數。您可以使用變量(或者如果有多個名稱具有相同次數的名稱的情況下的名稱數組)跟蹤最大值。

運行時間是線性的(O(n),其中n是數組中的名稱數)。

+0

王子提供了一個例子,所以我給了他對號。我已經提出了你的答案,因爲它也是正確的,謝謝你提供它! –

0

獲取發生次數。

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