我有两个数组。一个是名称数组,另一个是由标题为“是”或“否”的字符串组成的数组。 “name”数组中每个名称的索引路径对应于“Yes / No”数组中的相同索引路径。例如:
Names Array | Yes/No Array
Person 1 | Yes
Person 2 | No
Person 3 | Yes
查找某个人姓名的最简单方法是什么(可能是获取它的索引路径)并检查“是/否”数组中是“是”还是“否”?
另外,我不确定“索引路径”是否是正确的术语。如果不是,我的意思是对象在数组中的数字。
答案 0 :(得分: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;
因为Bavarious问我假设的问题,所以当名字数组按字母顺序排序时,这是一种更好的方法。
int index = [self findName:@"John Smith"];
NSString *answer = nil;
if (index >= 0) {
answer = [yesNoArray objectAtIndex:index];
}
return answer;
其中函数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;
}
答案 1 :(得分:9)
尝试保持两个阵列同步只是在寻找麻烦。当然,它可以完成,但是无论何时修改一个数组,都必须记住对另一个进行相应的更改。通过重新思考存储数据的方式,帮自己一个忙,避免那种错误。
在这种情况下,你有一个{person,boolean}对。一种选择是将每对存储为字典,然后保留这些字典的数组。如果您可以将数据的数量扩展到您拥有的数据之外,这将是一个特别好的计划。另一种选择是使用字典,其中键是人名,值是你的是/否值。这使得您的问题的答案非常简单:
NSString *yesOrNo = [personDictionary objectForKey:personName];
回到原来的问题,你仍然拥有两个数组,最简单的要做的事情就是迭代人数组,直到找到你要找的人,得到该名称的索引,然后在yes / no数组中查找相应的值:
for (person in peopleArray) {
if ([person isEqualToString:thePersonYoureLookingFor]) {
yesNoValue = [yesNoArray objectAtIndex:[peopleArray indexOfObject:person];
break;
}
}
如果列表中的人数不是太大,那就没问题。如果列表可能很大,那么您需要对person数组进行排序,以便您可以进行二进制搜索。但是,那里的问题是你是/没有数组是分开的,所以在保持yes / no数组正确顺序的同时对personArray进行排序变得复杂。
答案 2 :(得分:2)
您也可以使用下面的代码,可能对您有用,
NSSortDescriptor *_lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@"" ascending:YES];
NSArray *_lastArray = [NSArray arrayWithObject:_lastDescriptor];
firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]
sortedArrayUsingDescriptors:_lastArray];
//firstCharacterArray = (NSMutableArray *)[[nameIndexesDictionary allKeys]
sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
for (NSString *eachlastIndex in firstCharacterArray)
{
NSSortDescriptor *lastDescriptor = [[NSSortDescriptor alloc] initWithKey:@""
ascending:YES];
//selector:@selector(localizedCaseInsensitiveCompare:)] ;
NSArray *descriptorslast = [NSArray arrayWithObject:lastDescriptor];
[[nameIndexesDictionary objectForKey:eachlastIndex]
sortUsingDescriptors:descriptorslast];
[lastDescriptor release];
}
答案 3 :(得分:0)
您可以使用indexOfObject
方法获取元素的索引。
例如
这将为您提供对象的索引
NSInteger index = [yourArray indexOfObject:objectName];
查看另一个数组中的相应元素
[anotherArray objectAtIndex:index];
这对我有用。希望这会有所帮助。