检查多个搜索组合的最佳方法

时间:2013-02-08 09:59:00

标签: objective-c algorithm

我使用不同的搜索组合制作了应用。

该应用程序有6个文本字段用于放入和搜索文本。每个文本字段都用于其他搜索条件。

在搜索之前,只需要填写一个文本字段。除此之外,用户还可以选择要填写和搜索的文本字段数。因此,可能存在多种搜索组合。

问题是,确定填写哪些文本字段以及如何搜索满足搜索条件的对象的最佳方法是什么。

搜索方法应该遍历一个对象数组(在我的例子中是一个雇员对象数组),并检查这些值是否匹配。

我的目标是限制if语句的数量。

更新

现在是我的代码:

-(IBAction)SearchEmployees:(id)sender{

NSString *fullName = [(textfieldName.text)uppercaseString];
NSString *functionName = [(textfieldFunction.text)uppercaseString];
NSString *department = [(textfieldDepartment.text)uppercaseString];
NSString *field = [(textfieldField.text)uppercaseString];
NSString *expertise = [(textfieldExpertise.text)uppercaseString];
NSString *interest = [(textfieldInterest.text)uppercaseString];

NSMutableDictionary *filledTextfields = [NSMutableDictionary dictionary];

if (![fullName isEqualToString:@""]){
    [filledTextfields setObject: fullName  forKey: @"fullName"];
}

if (![functionName isEqualToString:@""]){
    [filledTextfields setObject: functionName  forKey: @"functionName"];
}

if (![department isEqualToString:@""]){
    [filledTextfields setObject: department  forKey: @"department"];
}

if (![field isEqualToString:@""]){
    [filledTextfields setObject: field  forKey: @"field"];
}

if (![expertise isEqualToString:@""]){
    [filledTextfields setObject: expertise  forKey: @"expertise"];
}

if (![interest isEqualToString:@""]){
    [filledTextfields setObject: interest forKey: @"interest"];
}


NSMutableArray *foundEmployee = [[NSMutableArray alloc]init];

 for (id key in filledTextfields)
 {
     NSLog(@"KEY: %@ OBJECT: %@", key, [filledTextfields objectForKey:key]);

     for (Employee *employee in self.employees){    //self.employees is the array to search in
         //do something
     }

 }

2 个答案:

答案 0 :(得分:2)

我会使用NSMutableDictionary,将数组的内容添加到字典中,并使用适当的搜索项作为字典的键,然后当您搜索某些内容时,您可以从文本字段中获取文本并执行[dictionary objectForKey:textfieldText]并返回相应的对象,如果该搜索词没有对象,则返回nil。

我不完全确定您的搜索条件是如何工作的,但这可能有用。

答案 1 :(得分:1)

我会构建一个“复合谓词”来过滤数组:

NSMutableArray *predicates = [NSMutableArray array];
if ([textFieldName.text length] > 0) {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"fullName =[c] %@", textFieldName.text];
    [predicates addObject:pred];
}
if ([textfieldFunction.text length] > 0) {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"functionName =[c] %@", textfieldFunction.text];
    [predicates addObject:pred];
}
// ... same procedure for remaining search criteria ...

if ([predicates count] > 0) { // At least one search criterion
    NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
    NSArray *foundEmployees = [self.employees filteredArrayUsingPredicate:finalPredicate];
}

=[c]进行不区分大小写的比较。如果合适,您还可以使用BEGINSWITH[c]CONTAINS[c]

谓词使用键值编码,因此fullNamefunctionName等应该是员工对象的属性。