Pre*_*ton 19 arrays iphone cocoa-touch objective-c ios
我有两个数组.一个是名称数组,另一个是由标题为"是"或"否"的字符串组成的数组."name"数组中每个名称的索引路径对应于"Yes/No"数组中的相同索引路径.例如:
Names Array | Yes/No Array
Person 1 | Yes
Person 2 | No
Person 3 | Yes
Run Code Online (Sandbox Code Playgroud)
查找一个人姓名(可能获得它的索引路径)并检查"是/否"数组中的"是"或"否"是最简单的方法是什么?
另外,我不确定"索引路径"是否是正确的术语.如果不是,我的意思是对象在数组中的数字.
Pen*_*One 31
NSArray
有一个被调用的方法indexOfObject
,如果没有找到这样的对象,将返回其对应的数组值等于anObject的最低索引或NSNotFound.如果您的名称数组未排序,则使用此数组获取您可以插入Yes/No数组的索引.也就是说,这些是:
NSString *answer = nil;
NSUInteger index = [namesArray indexOfObject:@"John Smith"];
if (index != NSNotFound) {
answer = [yesNoArray objectAtIndex:index];
}
return answer;
Run Code Online (Sandbox Code Playgroud)
因为Bavarious问我假设的问题,所以当名字数组按字母顺序排序时,这是一种更好的方法.
int index = [self findName:@"John Smith"];
NSString *answer = nil;
if (index >= 0) {
answer = [yesNoArray objectAtIndex:index];
}
return answer;
Run Code Online (Sandbox Code Playgroud)
其中函数findName
是一个简单的二进制搜索:
-(int)findName:(NSString *)name {
int min, mid, max;
NSComparisonResult comparisonResult;
min = 0;
max = [namesArray count]-1;
while (min <= max) {
mid = min + (max-min)/2;
comparisonResult = [name compare:[namesArray objectAtIndex:mid]];
if (comparisonResult == NSOrderedSame) {
return mid;
} else if (comparisonResult == NSOrderedDescending) {
min = mid+1;
} else {
max = mid-1;
}
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
试图保持两个阵列同步只是在寻找麻烦.当然,它可以完成,但每当你修改一个数组时,你必须记住对另一个数组进行相应的更改.通过重新思考存储数据的方式,帮自己一个忙,避免整个类错误.
在这种情况下,你有一个{person,boolean}对.一种选择是将每对存储为字典,然后保留这些字典的数组.如果您可以将数据的数量扩展到您拥有的数据之外,这将是一个特别好的计划.另一种选择是使用字典,其中键是人名,值是你的是/否值.这使得您的问题的答案非常简单:
NSString *yesOrNo = [personDictionary objectForKey:personName];
Run Code Online (Sandbox Code Playgroud)
回到原来的问题,你仍然拥有两个数组,最简单的方法是迭代人数组,直到找到你要找的人,得到那个名字的索引,然后查找yes/no数组中的对应值:
for (person in peopleArray) {
if ([person isEqualToString:thePersonYoureLookingFor]) {
yesNoValue = [yesNoArray objectAtIndex:[peopleArray indexOfObject:person];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如果列表中的人数不是太大,那就没问题.如果列表可能很大,那么您需要对person数组进行排序,以便您可以进行二进制搜索.但是,那里的问题是你是/没有数组是分开的,所以在保持yes/no数组正确顺序的同时对personArray进行排序变得复杂.