2012-04-22 114 views
0

是否有像下面的功能類(功能,方法等或任何功能)?是否有類(功能,方法等或任何功能)像下面的功能?

概念的例子)

一個使所有情況組合的類。 caseResultAsString的

NSString *sourceString = [[NSString alloc] initWithString:@"ABC"]; 
    NSArray *sourceArray = [[NSArray alloc] initWithObjects:@"A", @"B", @"C"]; 

    someClass *someClass1 = [[someClass alloc] init]; 

    NSString *caseResultAsString = [someClass1 makeAllCaseCombinationToStr:sourceString pair:2]; 
    NSArray *caseResultAsArray = [someClass1 makeAllCaseCombinationToArray:sourceArray pair:2]; 

值是 「AA AB AC BA BB BC CA CB CC」(一對參數爲2)caseResultAsArray的

值是 { 「AA」, 「AB」, 「 AC」, 「BA」, 「BB」, 「BC」, 「CA」, 「CB」, 「CC」}

如果輸入源和輸出的結果是任何類型或者任何方式,沒關係。

我想知道是否有具有上述概念特徵的類。

+0

強大的API將開發人員變成懶惰的開發人員。 – Jack 2012-04-22 17:06:24

+0

所以,你要找的是一個**排列庫**,是否正確? – 2012-04-22 17:08:00

+0

我認爲這種組合經常被使用。不是嗎? – 2012-04-22 17:11:43

回答

0

這裏是一個非常簡單的NSSet類別:

@interface NSSet(Permutations) 

-(NSSet *) setWithPermuations:(int) n; 

@end 

@implementation NSSet(Permutations) 

// data should be NULL the first time through 
static void for_loop(int count, int levels, void (^block)(int *levels), int *data) 
{ 
    int freeData = 0; 
    if (!data) 
    { 
     data = malloc(sizeof(int) * levels); 
     freeData = 1; 
    } 

    for (int i = 0; i < count; i++) { 
     data[levels - 1] = i; 

     if (levels) 
      for_loop(count, levels - 1, block, data); 
     else { 
      if (block) 
       block(data); 
     } 
    } 

    if (freeData) 
     free(data); 
} 

-(NSSet *) setWithPermuations:(int)n 
{ 
    NSMutableArray *returnArray = [NSMutableArray array]; 
    NSArray *thisArray = [self allObjects]; 

    for_loop(thisArray.count, n, ^(int *levels) { 
     NSMutableString *concat = [NSMutableString string]; 

     for (int i = 0; i < n; i++) { 
      [concat appendFormat:@"%@", [thisArray objectAtIndex:levels[i]]]; 
     } 

     [returnArray addObject:concat]; 

    }, NULL); 

    return [NSSet setWithArray:returnArray]; 
} 

@end 

顯然,算法的時間是O((N^T) + O(N)),其中N是集合中的元素和T是每滲透對象的數量。如果需要,可以很容易地將其更改爲NSArrays的NSSet,但是這當前僅使用一個字符串。

+0

我爲你的努力鼓掌。 – 2012-04-22 17:26:47

+0

此代碼不會生成集合的排列。 – alecail 2012-12-17 18:30:13