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

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)


Cal*_*leb 9

试图保持两个阵列同步只是在寻找麻烦.当然,它可以完成,但每当你修改一个数组时,你必须记住对另一个数组进行相应的更改.通过重新思考存储数据的方式,帮自己一个忙,避免整个类错误.

在这种情况下,你有一个{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进行排序变得复杂.

  • @Preston,即使你从两个数组开始,也很容易从两个数组创建一个字典:`peopleDictionary = [NSDictionary dictionaryWithObjects:yesNoArray andKeys:peopleArray];`.如果你想要一个字典数组并没有那么困难 - 只需创建一个循环,从每个数组的相应元素构造一个字典,然后将该字典添加到最终数组.Bavarious提到的自定义类也是一个不错的选择,特别是如果有任何与人有关的逻辑. (2认同)