谓词不敏感搜索两个字符串数组

Posted

技术标签:

【中文标题】谓词不敏感搜索两个字符串数组【英文标题】:Predicate insensitive search for two array of strings 【发布时间】:2015-11-27 05:01:29 【问题描述】:

我试图从两个数组中获取公共值但不敏感的匹配。但不能成功。谓词有什么问题。

    NSMutableArray *tempArray1 = [NSMutableArray arrayWithObjects:@"apple", @"cat", nil];
    NSMutableArray *tempArray2 = [NSMutableArray arrayWithObjects:@"APPLE", @"CAT", nil];
   // NSPredicate *resultPredicate1 = [NSPredicate predicateWithFormat:@"SELF IN [cd] %@", tempArray1];
    NSPredicate *resultPredicate1 = [NSPredicate predicateWithFormat:@"SELF [cd] IN  %@", tempArray1];
    NSMutableArray *arr_filteredtest = [NSMutableArray arrayWithArray:[tempArray2 filteredArrayUsingPredicate:resultPredicate1]];
    NSLog(@"%lu",(unsigned long)arr_filteredtest.count);

【问题讨论】:

那么如果你的数组是"Cat","Dog","Cow""CAT","horse",那么你的结果应该是"Cat","Dog","Cow","horse"吧? 我认为正确的答案是catCAT 请澄清:在您的示例中,公共集应该具有哪些元素? @ShahiM 我想要猫,但不应该区分大小写 这实际上是与 Core Data 一起使用的吗? 【参考方案1】:

如果您想要两个数组中不区分大小写的唯一集,首先您必须将所有字符串小写或大写,然后创建NSSet

NSMutableArray *joindArr = [NSArray arrayWithArray:tempArray1, nil];
[joindArr addObjectsFromArray:tempArray2];
NSMutableArray *arr1 = [[NSMutableArray alloc]init]; //make a nsmutableArray 
for (int i = 0; i<[arr count]; i++) 
    [arr1 addObject:[[arr objectAtIndex:i]lowercaseString]];

NSSet *set = [NSSet setWithArray:(NSArray*)arr1];//this set has unique values

【讨论】:

【参考方案2】:

你可以使用NSSet实现交集,不幸的是使用NSSet的搜索是区分大小写的。

1.So 将两个数组都转换为普通大小写,upperCaselowerCase

2.使用intersectSet获取结果

示例:

NSMutableArray *tempArray1 = [NSMutableArray arrayWithObjects:@"apple", @"cat", nil];
NSMutableArray *tempArray2 = [NSMutableArray arrayWithObjects:@"APPLE", @"CAT", nil];

tempArray2 = [self convertStringObjectsToLoweCase:tempArray2]; //convert all elements to lower case/ upper case
NSSet *set1 = [NSSet setWithArray:tempArray1];
NSSet *set2 = [NSSet setWithArray:tempArray2];

NSMutableSet *mutableSet = [NSMutableSet setWithSet:set1]; //Initialize with parent array,usually array with more elements
[mutableSet intersectSet:set2];
NSArray *arrayContainingCommonObjects = [mutableSet allObjects];
NSLog(@"arrayContainingCommonObjects : %@",arrayContainingCommonObjects);

使用以下辅助方法

- (NSMutableArray *)convertStringObjectsToLoweCase:(NSMutableArray *)inputArray

    [inputArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) 
        if ([obj isKindOfClass:[NSString class]]) 
            NSString *loweCaseString = [(NSString *)obj lowercaseString];
            [inputArray replaceObjectAtIndex:idx withObject:loweCaseString];
        
    ];
    return  inputArray;

输出:

arrayContainingCommonObjects : ( 苹果, 猫)

【讨论】:

【参考方案3】:

我觉得你应该试试这个

    NSMutableArray *tempArray1 = [NSMutableArray arrayWithObjects:@"apple", @"cat", nil];
    NSMutableArray *tempArray2 = [NSMutableArray arrayWithObjects:@"apple", @"CAT", nil];
    NSMutableSet *intersection = [NSMutableSet setWithArray:tempArray1];
    [intersection intersectSet:[NSSet setWithArray:tempArray2]];
    NSArray *NEW_ARR = [intersection allObjects];
    NSLog(@"new arry::  %@",NEW_ARR);

【讨论】:

是的,这是从两个数组中获取公共元素的最佳方法 你错过了问题的关键部分:但不敏感的匹配

以上是关于谓词不敏感搜索两个字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 和数组进行 cloudKit 搜索

带有嵌套数组的 NSPredicate

在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词

具有最快“存在”搜索的 C++ 容器(向量/数组/等)

需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)

不支持没有相等谓词的流流连接