2009-07-09 12 views
8

इससे पहले कि मैं कतारNSMutableArray का उपयोग कर, मैं जानना चाहता हूं कि कुछ और मानक उपलब्ध है या नहीं। मुझे ऐप्पल दस्तावेज़ों में कुछ भी दिखाई नहीं देता है, लेकिन अगर मैं कहीं से लोगों का उपयोग कर रहा हूं तो कतार कार्यान्वयन नहीं है तो मुझे आश्चर्य होगा। जावा मुझे खराब कर देता है!क्या आईफोन के लिए कोई कतार/फीफो डेटा संरचना है?

उत्तर

10

NSMutableArray पर आधारित एक कतार लागू करना काफी आसान है, यह शायद कोड की 50 पंक्तियों के नीचे है।

संपादित करें:

एक त्वरित गूगल खोज के साथ इस मिला:

@interface Queue:NSObject { 
    NSMutableArray* objects; 
} 
- (void)addObject:(id)object; 
- (id)takeObject; 
@end 

@implementation Queue 

- (id)init { 
    if ((self = [super init])) { 
     objects = [[NSMutableArray alloc] init];  
    } 
    return self; 
} 

- (void)dealloc { 
    [objects release]; 
    [super dealloc]; 
} 

- (void)addObject:(id)object { 
    [objects addObject:object]; 
} 

- (id)takeObject { 
    id object = nil; 
    if ([objects count] > 0) { 
     object = [[[objects objectAtIndex:0] retain] autorelease]; 
     [objects removeObjectAtIndex:0]; 
    } 
    return object; 
} 

@end 
+1

+1 मैं कोड एक बालक स्वरूपण, और -takeObject विधि साफ। –

+0

अपने डेलोक पर एक [ऑब्जेक्ट रिलीज] जोड़ें, मैं आपको एक +1 – slf

+0

दूंगा एक बेहतर कार्यान्वयन एक लिंक की गई सूची होगी। एक लिंक्ड सूची के साथ आप प्रत्येक ऑपरेशन को ओ (1) में बिताए गए समय को अनुकूलित कर सकते हैं। एनएसएमयूटेबलएरे के साथ आपके पास प्रत्येक टेकऑब्जेक्ट के लिए ओ (एन) ऑपरेशन होता है (removeObjectAtIndex सभी तत्वों को नीचे स्थानांतरित कर देगा)। – George

5

कोको अपने आप में एक पंक्ति वर्ग नहीं है, और वहाँ एक मानक दर असल नहीं है, लेकिन वहाँ कई विकल्प हैं, एक जिनमें से आपकी आवश्यकताओं के अनुरूप सबसे अच्छा हो सकता है। this question देखें (और my answer)।

जैसा कि आपने कहा था, आप एनएसएमयूटेबलएरे का उपयोग करके अपना खुद का रोल कर सकते हैं। यदि आपको केवल एक त्वरित 'कतरनी कतार की आवश्यकता है (और प्रतिलिपि, एन्कोडिंग/डिकोडिंग, गणना, इत्यादि के बारे में चिंतित नहीं हैं) तो समाधान @ मैट सुझाव एक आसान दृष्टिकोण है। आपको adding queue methods to NSMutableArray via a category पर भी विचार करना चाहिए, जिसमें यह अच्छा है कि आपकी "कतार" भी एक सरणी है (इसलिए आप इसे एनएसएआरएआर पैरामीटर के लिए पास कर सकते हैं), और आपको मुफ्त में सभी एनएस (म्यूटेबल) ऐरे कार्यक्षमता मिलती है।

यदि प्रदर्शन महत्वपूर्ण है, तो मैं पहले तत्व को हटाने के लिए आदर्श रूप से उपयुक्त संरचना का उपयोग करने की अनुशंसा करता हूं। मैंने इस कारण से अपने स्वयं के ढांचे के लिए CHCircularBufferQueue लिखा था। (दूसरों को कुछ समय बचाने की कोशिश नहीं कर रहा है, बस अपना खुद का सींग मारने की कोशिश नहीं कर रहा है।)

1

मै मैट ब्रिज कोड के आधार पर मैंने केवल डेक विधि वाली एक श्रेणी बनाई है।

@interface NSMutableArray (ShiftExtension) 
// returns the first element of self and removes it 
-(id)shift; 
@end 

@implementation NSMutableArray (ShiftExtension) 
-(id)shift { 
    if([self count] < 1) return nil; 
    id obj = [[[self objectAtIndex:0] retain] autorelease]; 
    [self removeObjectAtIndex:0]; 
    return obj; 
} 
@end 
0

आप सी ++ स्टैंडर्ड लाइब्रेरी से एसटीएल कतार उपयोग कर सकते हैं।

0

STL priority queue देखें। इसके लिए कोड की शून्य रेखाओं की आवश्यकता होती है और यह पोर्टेबल है! आप और अधिक क्या चाह सकते थे?

+0

धागा सुरक्षा;) – Michael

0

आप एनएसएआरएआरई की अंतिम ऑब्जेक्ट विधि का उपयोग कर सकते हैं। यहाँ एक अपरीक्षित उदाहरण है:

Queue.h

#import <Foundation/Foundation.h> 

@interface Queue : NSObject 

-(void)enqueue:(id)object; 
-(id)dequeue; 

@end 

Queue.m

#import "Queue.h" 

@interface Queue() 

@property(nonatomic, strong) NSMutableArray *backingArray; 

@end 

@implementation Queue 

-(id)init { 
    self = [super init]; 

    if (self) { 
     self.backingArray = [NSMutableArray array]; 
    } 
    return self; 
} 

-(void)enqueue:(id<NSObject>)object { 
    [self.backingArray addObject:object]; 
} 

-(id)dequeue { 
    id object = [self.backingArray lastObject]; 
    [self.backingArray removeObject:object]; 
    return object; 
} 

@end 
संबंधित मुद्दे