Фильтр сравнивает массив с тем же индексом swift 4 - PullRequest
0 голосов
/ 27 августа 2018

Мой случай - создать вопросы с несколькими вариантами ответов, и я хочу сравнить массив в том же индексе

Правильный ответ:

[3, 2, 0, 2, 2]

Ответ пользователя:

[3, 2, 3, 1, 1]

Ожидаемый результат:

[3,2]

А это код

let filteredArray = correctAnswer.filter{ userAnswer.contains($0) }
print(filteredArray)

Но вывод:

[3, 2, 2, 2]

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете zip два массива, чтобы отфильтровать ответы, которые были правильными:

zip(userGuesses, correctAnswers).filter { (guess, answer) in guess == answer }

Далее, если вам нужны только правильные ответы, вы можете отобразить заархивированную последовательность, чтобы получить только ответы пользователей:

zip(userGuesses, correctAnswers)
    .filter { (guess, answer) in guess == answer }
    .map { (guess, _) in guess }

Тем не менее, здесь не сказано, на какие вопросы был дан правильный ответ. Например: если правильные ответы были [1,2,3,2,1,3], а пользователь ответил [1,3,1,2,3,3], было бы невозможно узнать, какие вопросы пользователь получил правильно (так как и #1, #3, #1, #6, и #5, #6, все результаты в [1,3]

0 голосов
/ 27 августа 2018

Если вы хотите сравнить два индекса массива по индексу, вы можете использовать compactMap с zip.

let correctAns = [3, 2, 0, 2, 2]
let userAns = [3, 2, 3, 1, 1]
let finalAns = zip(correctAns, userAns).compactMap({ $0 == $1 ? $0 : nil })
print(finalAns) // [3, 2]

Редактировать: Вы можете даже упростить это с помощью предложения @MartinR.

let finalAns = zip(correctAns, userAns).filter(==).map { $1 }

Если вам нужен индекс правильного ответа, вы можете получить вот так.

let finalAnsIndex = zip(correctAns, userAns).enumerated().compactMap({ $0.element.0 == $0.element.1 ? $0.offset : nil })
print(finalAnsIndex) // [0, 1]
...