获取数组中的对象索引来查找其他数组中的对应对象

我有两个数组。 一个是一个名称数组,另一个是由“Yes”或“No”string组成的数组。 “名称”数组中每个名称的索引path与“是/否”数组中的相同索引path相对应。 例如:

Names Array | Yes/No Array Person 1 | Yes Person 2 | No Person 3 | Yes 

查找一个人的姓名(可能是索引path)最简单的方法是什么?在“是/否”数组中检查他们是“是”还是“否”?

另外,我不确定“索引path”是否适合使用。 如果不是,我的意思是一个对象在数组中的数字。

NSArray有一个名为indexOfObject的方法,如果没有find这样的对象,它将返回对应数组值等于anObject的最低索引或NSNotFound。 如果你的名字数组是未sorting的,那么用这个来得到你可以插入到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是一个简单的二分search:

 -(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; } 

试图保持两个arrays同步只是要求麻烦。 当然可以这样做,但是当你修改一个数组的时候,你必须记得对另一个数组做相应的修改。 通过重新思考存储数据的方式来帮助自己,并避免整个类的错误。

在这种情况下,你有一个{person,boolean}对。 一种select是将每一对存储为字典,然后保存这些字典的数组。 如果您可以将数据的数量扩展到超出两个的数量,这将是一个特别好的计划。 另一种select是使用字典,其中键是人名,值是你的是/否值。 这使得你的问题的答案非常简单:

 NSString *yesOrNo = [personDictionary objectForKey:personName]; 

回到你原来的问题,你仍然有两个数组, 最简单的事情就是迭代person数组,直到find你正在寻找的人,得到那个名字的索引,然后查找是/否数组中对应的值:

 for (person in peopleArray) { if ([person isEqualToString:thePersonYoureLookingFor]) { yesNoValue = [yesNoArray objectAtIndex:[peopleArray indexOfObject:person]; break; } } 

如果列表中的人数不是很多,那就好了。 如果列表可能很大,那么您将需要保持人员数组sorting,以便您可以执行二进制search。 但是,那里的麻烦是你是/没有数组是分开的,所以在保持yes / no数组顺序的同时对personArray进行sorting变得复杂。

你也可以使用下面的代码,可能对你有用,

 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]; } 

你可以使用indexOfObject方法来获取元素的索引。

例如

这会给你的对象的索引

  NSInteger index = [yourArray indexOfObject:objectName]; 

从另一个数组中查看相应的元素

 [anotherArray objectAtIndex:index]; 

这对我有效。 希望这可以帮助。