2011-06-08 8 views
5

मैं एक एनएसएमयूटेबलएरे को संशोधित करने का सबसे अच्छा तरीका ढूंढ रहा हूं जो एक ही ऑब्जेक्ट के कई उदाहरण रख सकता है। मैं 4.0 के तहत आईओएस संस्करणों के लिए भी काम कर रहा हूं इसलिए ब्लॉक का उपयोग करने का कोई तरीका नहीं है।एनएसएमयूटेबलएरे ऑब्जेक्ट्स की घटनाओं की गिनती करते हैं और फिर सरणी को पुनर्व्यवस्थित करते हैं

ARRAY = [object1,object2,object3,object4,object5,object6,object7,object8]; 

की कि object2 object3 कहना और object4 ही वस्तुओं वास्तव में कर रहे हैं:

मैं इस तरह एक सरणी है:

यहाँ की स्थिति है। और ऑब्जेक्ट 1 और ऑब्जेक्ट 7 भी। फिर मैं सरणी को पुनर्व्यवस्थित करना चाहता हूं ताकि सबसे अधिक घटनाएं पहले दिखाई दे सकें। तो सरणी को इस तरह दिखना होगा:

[object2, object3, object4, object1, object7, object5, object6, object8];

+0

आप कैसे व्यवहार की अपेक्षा करते हैं कि आप एक ही आकार के साथ दो वस्तुओं की 'समूह' है जब? ऑब्जेक्ट 2, ऑब्जेक्ट 3, ऑब्जेक्ट 4 एक ही ऑब्जेक्ट कहें, और ऑब्जेक्ट 1, ऑब्जेक्ट 7, ऑब्जेक्ट 8 एक ही ऑब्जेक्ट है। चूंकि इन दो वस्तुओं में सबसे अधिक घटनाएं हैं, इसलिए उनके संबंधित सरणी तत्वों को परिणामी सरणी में संगत होने की आवश्यकता है? –

उत्तर

0

आप isKindOfClass & isMemberOfClass उदाहरण विधियों का उपयोग करके इसका प्रबंधन कर सकते हैं। तो बस अपने सरणी के माध्यम से पाश और अपनी आवश्यकताओं के

6

है कि ऐसा करने का कुछ तरीके, जिनमें से एक एक सहायक NSCountedSet उदाहरण और एक समारोह का उपयोग करता है का उपयोग करना है कर रहे हैं के आधार पर नए सरणी में आइटम धक्का रखें कि तुलना के लिए NSCountedSet:

NSInteger countedSort(id obj1, id obj2, void *context) { 
    NSCountedSet *countedSet = context; 
    NSUInteger obj1Count = [countedSet countForObject:obj1]; 
    NSUInteger obj2Count = [countedSet countForObject:obj2]; 

    if (obj1Count > obj2Count) return NSOrderedAscending; 
    else if (obj1Count < obj2Count) return NSOrderedDescending; 
    return NSOrderedSame; 
} 

और

NSMutableArray *array = …; 

NSCountedSet *countedSet = [[[NSCountedSet alloc] initWithArray:array] 
    autorelease]; 

[array sortUsingFunction:countedSort context:countedSet]; 

संपादित करें: extremeboredom ज चूंकि चतुरता से ध्यान दिया गया कि यदि दो अलग-अलग वस्तुओं में समान दोहराव की गणना होती है तो उनके संबंधित तत्व परिणामी सरणी में आवश्यक रूप से संगत नहीं होते हैं। इस समाधान का उपयोग केवल तभी किया जाना चाहिए जब समान वस्तुओं के लिए आवश्यक न हो।


आगे संपादित करें: मामले में आप एक ही वस्तु का प्रतिनिधित्व तत्वों आस पास होने की जरूरत है आप अलग-अलग एलीमेंट केवल उनके दोहराने गिनती के अनुसार क्रमबद्ध साथ एक छोटे सरणी बना सकते हैं। फिर, दोहराना गिनती द्वारा क्रमबद्ध तत्वों के साथ एक और सरणी बनाएँ। आपकी ज़रूरतों के आधार पर, आपको वास्तव में परिणामी सरणी की आवश्यकता नहीं हो सकती है - शायद केवल distinctArray & गिनती सेट पर्याप्त है।

NSMutableArray *array = …; 
NSCountedSet *countedSet = [[[NSCountedSet alloc] initWithArray:array] 
    autorelease]; 

// Array with distinct elements only, sorted by their repeat count 
NSArray *distinctArray = [[countedSet allObjects] 
    sortedArrayUsingFunction:countedSort context:countedSet]; 

// Array with all the elements, where elements representing the same 
// object are contiguous 
NSMutableArray *sortedArray = [NSMutableArray arrayWithCapacity:[array count]]; 
for (id object in distinctArray) { 
    for (NSUInteger i = 0; i < [countedSet countForObject:object]; i++) { 
     [sortedArray addObject:object]; 
    } 
} 
+0

यह एक अच्छा विचार की तरह लगता है, लेकिन यह काफी नहीं है। यह वहां वस्तुओं को मिलाएगा जिसमें एक से अधिक संग्रह एक ही संख्या में कई वस्तुओं के साथ होगा। ओपी को यह निर्धारित करने की आवश्यकता है कि वे एक ही गिनती के साथ वस्तुओं के समूहों को ऑर्डर करना चाहते हैं, और इसे सॉर्ट विधि में शामिल करें। – extremeboredom

+0

@extr आह, सच है कि! मैं इस सवाल पर एक टिप्पणी पोस्ट करूंगा। –

1

आपको NSBag, by Erica Sadun (गिटहब) की आवश्यकता है। सरल उपयोग के मामले:

NSArray *objArray = @[ @"a", @"a", @"b", @"B", @"c", @"cc", @"c"];  
NSBag  *aBag = NSBag.new; 

for (id thing in objArray)  [aBag add:thing]; // fill the bag 

for (id unique in aBag.objects)     // count'em out 
     NSLog( @"%@,  %i", 
        unique, [aBag occurrencesOf:unique]); 

उत्पादन:

cc, 1 
b, 1 
B, 1 
c, 2 
a, 2 
संबंधित मुद्दे