Подтвердить что ты не робот

Получить индекс объекта в массиве для поиска соответствующего объекта в другом массиве

У меня есть два массива. Один из них представляет собой массив имен, а другой - массив, состоящий из строк под названием "Да" или "Нет". Индексный путь каждого имени в массиве "name" соответствует одному и тому же пути индекса в массиве "Да/Нет". Например:

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

Каким будет самый простой способ найти имя человека (возможно, получить его путь к индексу) и проверить, являются ли они "Да" или "Нет" в массиве "Да/Нет"?

Кроме того, я не уверен, что "указательный путь" - это правильный термин для использования. Если это не так, я имею в виду число, в котором объект находится в массиве.

4b9b3361

Ответ 1

NSArray имеет метод под названием indexOfObject, который будет возвращать либо самый низкий индекс, значение соответствующего массива которого равно aObject или NSNotFound, если такой объект не найден. Если ваш массив имен несортирован, используйте его, чтобы получить индекс, который затем можно подключить к массиву Да/Нет. То есть, что-то в этом роде:

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

Ответ 2

Попытка сохранить два синхронизированных массива - это просто запрос на неприятности. Конечно, это можно сделать, но всякий раз, когда вы меняете один массив, вы должны помнить о том, чтобы сделать соответствующее изменение другому. Сделайте себе одолжение и избегайте этого целого класса ошибок, переосмыслив способ хранения данных.

В этом случае у вас есть пара {person, boolean}. Один из вариантов - хранить каждую пару в качестве словаря, а затем хранить массив этих словарей. Это было бы особенно хорошим планом, если бы вы могли расширить количество данных за пределами двух, которые у вас есть. Другим вариантом было бы просто использовать словарь, где ключи - это имена людей, а значения - ваши значения yes/no. Это очень легко ответить на ваш вопрос:

NSString *yesOrNo = [personDictionary objectForKey:personName];

Возвращаясь к исходному вопросу, где у вас все еще есть два массива, проще всего перебирать массив персонажей, пока не найдете человека, которого вы ищете, получите индекс этого имени, а затем найдите соответствующее значение в массиве да/нет:

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

Это хорошо, если количество людей в списке не слишком велико. Если список может быть большим, тогда вам нужно будет отсортировать массив пользователей так, чтобы вы могли выполнять двоичный поиск. Однако проблема заключается в том, что вы да/нет массива отдельно, поэтому сортировка personArray при сохранении массива yes/no в правильном порядке становится сложной.

Ответ 3

Вы также можете использовать ниже код, пусть он вам полезен,

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

Ответ 4

Вы можете использовать метод indexOfObject для получения индекса элемента.

например

Это даст вам индекс вашего объекта

  NSInteger index = [yourArray indexOfObject:objectName];

Чтобы увидеть соответствующий элемент из другого массива

[anotherArray objectAtIndex:index];

Это сработало для меня. Надеюсь, это поможет.