谓词不敏感搜索两个字符串数组
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"
吧?
我认为正确的答案是cat
或CAT
。
请澄清:在您的示例中,公共集应该具有哪些元素?
@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 将两个数组都转换为普通大小写,upperCase
或 lowerCase
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 搜索
在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词