2011-12-20 56 views
10

मेरे पास एमएमपीएलएएस नामक वस्तुओं का एनएसएआरआरई है, जिसमें एमएमपी उत्पाद वस्तुओं का एनएसएआरआरई है।संयुक्त Arrays के एनएसएआरएआर

मैं एमएमपीएलएक्स ऑब्जेक्ट के मेरे ऐरे में सभी एमएमपीआरटीटी ऑब्जेक्ट्स का संयुक्त एनएसएआरएआर कैसे प्राप्त करूं? NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"]; जैसा कुछ अच्छा होगा, हालांकि यह विशिष्ट उदाहरण काम नहीं करता है।

उत्तर

3

अपने मूल सरणी के माध्यम से एक एनएसएमयूटेबलएरे, लूप बनाएं और प्रत्येक सबएरे के साथ addObjectsFromArray: पर कॉल करें।

+0

धन्यवाद, यह मेरे – Eugene

2

मैं वहाँ नहीं लगता कि एक ऑफ-द-शेल्फ विधि आपको क्या चाहिए होता है कि है, लेकिन आप आसानी से अपने सरणी "समतल" कर सकते हैं एक for पाश में, और एक वर्ग में विधि छिपाने:

संपादित करें: एक श्रेणी जोड़ा।

@interface NSArray (flatten) 
    -(NSArray*) flattenArray; 
@end 

@implementation NSArray (flatten) 
-(NSArray*) flattenArray { 
    // If inner array has N objects on average, multiply count by N 
    NSMutableArray *res = [NSMutableArray arrayWithCapacity:self.count]; 
    for (NSArray *element in self) { 
     [res addObjectsFromArray:element]; 
    } 
    return res; 
} 
@end 
+0

के लिए काम किया है यही तो मैं से बचने के लिए कोशिश कर रहा हूँ। मान लीजिए कि कोई वास्तविक विकल्प नहीं है। :( – Eugene

+0

आप 'एनएसएआरएआरई' की श्रेणी में कार्यान्वयन जोड़ सकते हैं, और इसे एक अच्छी छोटी विधि के पीछे अपनी दृष्टि से छुपा सकते हैं। – dasblinkenlight

0

यहां बताया गया है कि मैंने कैसे "फ़्लैटन" श्रेणी विधि लागू की है जो किसी भी पेड़ संरचना पर काम करेगी। यह मनमानी गहराई का एक पेड़ लेगा और इसे क्रम में एक लंबी सरणी में विलय करेगा।

- (NSArray *) flattenWithBlock:(NSArray *(^)(id obj))block { 
    NSMutableArray *newItems = [NSMutableArray array]; 
    for(id subObject in self) 
    { 
     if([subObject isKindOfClass:[NSArray class]]) 
     { 
      [newItems addObjectsFromArray:[subObject flatten:block]]; 
     } 
     else 
      [newItems addObject:subObject]; 
    } 

    return newItems; 
} 

फिर आप एक सुविधा श्रेणी विधि लिख सकते हैं जो ऊपर वर्णित मामले को संभालता है। यह रैपर विधि एक एन डी सरणी को 1 डी सरणी में फहराएगी।

- (NSArray *) flattenArray { 
    NSArray *newItems = [self flattenWithBlock:^NSArray *(id obj) { 
     return obj; 
    }]; 

    return newItems; 
} 
0
@interface NSArray (Flatten) 

-(NSArray*)flattenedArray; 

@end 

@implementation NSArray (Flatten) 

-(NSArray*)flattenedArray { 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count]; 
    for (id thing in self) { 
     if ([thing isKindOfClass:[NSArray class]]) { 
      [result addObjectsFromArray:[(NSArray*)thing flattenedArray]]; 
     } else { 
      [result addObject:thing]; 
     } 
    } 
    return [NSArray arrayWithArray:result]; 
} 

@end 
41

आप @unionOfArrays के साथ ऐसा कर सकते हैं। बिट आप अनदेखा कर रहे थे है कि इसकी वजह सरणियों सीधे नेस्टेड रहते हैं, संग्रह ऑपरेटर के अधिकार पर कुंजी self होना चाहिए:

NSArray *nestedValues = @[@[@1, @2, @3], @[@4, @5, @6]] 
NSArray *flattenedValues = [nestedValues valueForKeyPath:@"@unionOfArrays.self"]; 
// flattenedValues contains @[@1, @2, @3, @4, @5, @6] 
संबंधित मुद्दे