Objective c 从NSMutableArray筛选NSString对象

Objective c 从NSMutableArray筛选NSString对象,objective-c,ios6,nsstring,nsmutablearray,Objective C,Ios6,Nsstring,Nsmutablearray,我的应用程序从一个文本字段接收用户的输入,并生成所有可能由字母组成的单词 如果用户在“BOX”中键入,程序将生成一个可变数组,其中包含诸如“BO”、“BOB”、“BOO”、“OX”等词 我只需要过滤掉包含重复字母的单词,这些字母在用户输入中不存在。所以,我需要过滤掉“BOB”和“BOO” 我想另一个解决方案是首先避免生成BOB和BOO,但我也没有弄明白这一点 谢谢 假设包含所有可能字母的数组是所有组合,则可以使用 filteredarray使用NSArray的predicate函数创建过滤数组。

我的应用程序从一个文本字段接收用户的输入,并生成所有可能由字母组成的单词

如果用户在“BOX”中键入,程序将生成一个可变数组,其中包含诸如“BO”、“BOB”、“BOO”、“OX”等词

我只需要过滤掉包含重复字母的单词,这些字母在用户输入中不存在。所以,我需要过滤掉“BOB”和“BOO”

我想另一个解决方案是首先避免生成BOB和BOO,但我也没有弄明白这一点


谢谢

假设包含所有可能字母的数组是
所有组合
,则可以使用
filteredarray使用NSArray的predicate
函数创建过滤数组。因此,您需要定义一个precidate,该日期可以使用块轻松完成:

NSPredicate *filterPrecicate = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){
    BOOL filterEntry;
    // do actually filtering a set filterEntry to YES/NO
    return filterEntry
}];
创建块后,可以进行过滤:

NSArray *filteredCombinations = [allCombinations filteredArrayUsingPredicate: filterPrecicate];

假设包含所有可能字母的数组为
allcombination
,则可以使用
filteredarray使用NSArray的predicate
函数创建过滤数组。因此,您需要定义一个precidate,该日期可以使用块轻松完成:

NSPredicate *filterPrecicate = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){
    BOOL filterEntry;
    // do actually filtering a set filterEntry to YES/NO
    return filterEntry
}];
创建块后,可以进行过滤:

NSArray *filteredCombinations = [allCombinations filteredArrayUsingPredicate: filterPrecicate];

从给定单词的字母生成所有可能的组合(其中 字母仅使用一次)您可以使用以下递归方法:

- (NSArray *)allWordsFrom:(NSString *)word
{
    NSMutableArray *a = [NSMutableArray array];
    [self addAllWordsFrom:word withPrefix:@"" toMutableArray:a];
    return a;
}

- (void)addAllWordsFrom:(NSString *)letters withPrefix:(NSString *)prefix toMutableArray:(NSMutableArray *)a
{
    [letters enumerateSubstringsInRange:NSMakeRange(0, [letters length])
                    options:NSStringEnumerationByComposedCharacterSequences
                 usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                     // Add one letter to the prefix:
                     NSString *word = [prefix stringByAppendingString:substring];
                     [a addObject:word];
                     // Build combinations with remaining letters:
                     NSString *remainingLetters = [letters stringByReplacingCharactersInRange:substringRange withString:@""];
                     if ([remainingLetters length] > 0) {
                         [self addAllWordsFrom:remainingLetters withPrefix:word toMutableArray:a];
                     }
                 }];
}
对于单词“BOX”,这将创建列表

B, BO, BOX, BX, BXO, O, OB, OBX, OX, OXB, X, XB, XBO, XO, XOB B、 BO,BOX,BX,BXO,O,OB,OBX,OX,OXB,X,XB,XBO,XO,XOB
之后不必过滤数组。

从给定单词的字母生成所有可能的组合(其中 字母仅使用一次)您可以使用以下递归方法:

- (NSArray *)allWordsFrom:(NSString *)word
{
    NSMutableArray *a = [NSMutableArray array];
    [self addAllWordsFrom:word withPrefix:@"" toMutableArray:a];
    return a;
}

- (void)addAllWordsFrom:(NSString *)letters withPrefix:(NSString *)prefix toMutableArray:(NSMutableArray *)a
{
    [letters enumerateSubstringsInRange:NSMakeRange(0, [letters length])
                    options:NSStringEnumerationByComposedCharacterSequences
                 usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                     // Add one letter to the prefix:
                     NSString *word = [prefix stringByAppendingString:substring];
                     [a addObject:word];
                     // Build combinations with remaining letters:
                     NSString *remainingLetters = [letters stringByReplacingCharactersInRange:substringRange withString:@""];
                     if ([remainingLetters length] > 0) {
                         [self addAllWordsFrom:remainingLetters withPrefix:word toMutableArray:a];
                     }
                 }];
}
对于单词“BOX”,这将创建列表

B, BO, BOX, BX, BXO, O, OB, OBX, OX, OXB, X, XB, XBO, XO, XOB B、 BO,BOX,BX,BXO,O,OB,OBX,OX,OXB,X,XB,XBO,XO,XOB
之后不必过滤数组。

以下是根据请求过滤数组的代码。如果愿意,可以稍微修改它以使用谓词过滤

NSCountedSet *letterBinsForWord(NSString *word)
{
    NSCountedSet *bins = [NSCountedSet set];
    for (NSUInteger i=0, n=word.length;  i<n;  i++) {
        NSString *letter = [word substringWithRange:NSMakeRange(i, 1)];
        [bins addObject:letter];
    }
    return bins;
}

BOOL letterBinsIncludesBins(NSCountedSet *set0, NSCountedSet *set1)
{
    for (NSString *letter in set1) {
        if ([set0 countForObject:letter] < [set1 countForObject:letter])
            return NO;
    }
    return YES;
}


int main (int argc, const char * argv[])
{
    @autoreleasepool {

        NSString *userText = @"boox";
        NSArray  *words = @[@"box",@"ox",@"boo",@"booo",@"bo",@"bin"];

        NSCountedSet *letterBins = letterBinsForWord(userText);
        NSMutableArray *filteredWords = [NSMutableArray array];

        for (NSString *word in words) {
            NSCountedSet *bins = letterBinsForWord(word);
            if (letterBinsIncludesBins(letterBins, bins))
                [filteredWords addObject:word];
        }

        NSLog(@"Filtered words: %@",filteredWords);
    }
    return 0;
}

下面是根据请求筛选数组的代码。如果愿意,可以稍微修改它以使用谓词过滤

NSCountedSet *letterBinsForWord(NSString *word)
{
    NSCountedSet *bins = [NSCountedSet set];
    for (NSUInteger i=0, n=word.length;  i<n;  i++) {
        NSString *letter = [word substringWithRange:NSMakeRange(i, 1)];
        [bins addObject:letter];
    }
    return bins;
}

BOOL letterBinsIncludesBins(NSCountedSet *set0, NSCountedSet *set1)
{
    for (NSString *letter in set1) {
        if ([set0 countForObject:letter] < [set1 countForObject:letter])
            return NO;
    }
    return YES;
}


int main (int argc, const char * argv[])
{
    @autoreleasepool {

        NSString *userText = @"boox";
        NSArray  *words = @[@"box",@"ox",@"boo",@"booo",@"bo",@"bin"];

        NSCountedSet *letterBins = letterBinsForWord(userText);
        NSMutableArray *filteredWords = [NSMutableArray array];

        for (NSString *word in words) {
            NSCountedSet *bins = letterBinsForWord(word);
            if (letterBinsIncludesBins(letterBins, bins))
                [filteredWords addObject:word];
        }

        NSLog(@"Filtered words: %@",filteredWords);
    }
    return 0;
}

非常感谢你的帮助。我永远也想不到。谢谢你的帮助。我永远也想不到,这太棒了。谢谢你花时间回答我的问题。这太棒了。谢谢你花时间回答我的问题。我真的需要再学习一些。我开始尝试类似的东西,但我不知道如何使用积木。我真的需要进一步研究积木。我开始尝试类似的东西,但我不知道如何使用块。