2012-09-01 11 views
5

में सबसे अधिक बार-बार ऑब्जेक्ट ढूँढना मेरे पास प्रत्येक स्ट्रिंग नाम के साथ स्ट्रिंग से भरा सरणी है। कुछ नाम समान हो सकते हैं जबकि कुछ अलग हो सकते हैं। जिस भाषा में मैं काम कर रहा हूं वह उद्देश्य-सी है। मैं यह पता लगाने में सक्षम होना चाहता हूं कि कौन सा नाम इस सरणी से सबसे लोकप्रिय है (सरणी उपयोगकर्ता से ऐप को दी गई जानकारी के आधार पर गतिशील होगी)। मुझे यकीन नहीं है कि यह प्रभावी तरीके से कैसे किया जाए। अगर कोई इस पर विस्तार कर सकता है या एक उदाहरण प्रदान कर सकता है, तो इसकी सराहना की जाएगी।सरणी

आप

उदाहरण धन्यवाद:

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

बहुत कुशल नहीं दिखता है (जैसे सेशन ने पूछा): मैं शर्त लगाता हूं कि प्रत्येक '[बैग गिनतीऑर्जेक्ट:] 'पूरी सरणी के माध्यम से जाती है, और चूंकि आप इसे सरणी के प्रत्येक तत्व के लिए करते हैं, यह ओ (एन^2) है। @ सैमिर द्वारा सुझाए गए दृष्टिकोण बेहतर दिखते हैं। – Saphrosit

+0

यह वही है जैसे सरणी में प्रत्येक स्ट्रिंग को पूरे सरणी –

5

मैं (अपने मामले में NSMutableDictionary) एक हैश तालिका का प्रयोग करेंगे, तार के सरणी के माध्यम से जाना, उपयोग करने के लिए चला जाता है कुंजी के रूप में प्रत्येक स्ट्रिंग, और सरणी में इसकी घटनाओं की संख्या के रूप में अपना मान सेट करें। आप एक चर का उपयोग कर अधिकतम का ट्रैक रख सकते हैं (या नामों की एक सरणी यदि घटनाओं की संख्या के साथ कई नाम हैं)।

चलने का समय तब रैखिक (ओ (एन) है जहां एन आपके सरणी में नामों की संख्या है)।

+0

प्रिंस ने एक उदाहरण प्रदान किया, इसलिए मैंने उसे चेकमार्क दिया। मैंने आपका जवाब ऊपर उठाया है क्योंकि यह भी सही है और इसे प्रदान करने के लिए धन्यवाद! –

0

घटनाओं की संख्या प्राप्त करने के लिए।

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