#arrays #swift #indexing
#массивы #swift #индексирование
Вопрос:
Если у меня есть два массива и я хочу сравнить их индексы, например:
let var a1 = ["1", "2", "3"]
let var a2 = ["3", "2", "3"]
И я хотел напечатать что-нибудь, чтобы сказать, какой индекс не совпадает, например:
if a1[0] != a2[0] amp;amp; a1[1] == a2[1] amp;amp; a1[2] == a2[2]{
print("Index 0 is not the same.")
Должен ли я написать еще 7 таких операторов, чтобы показать все 8 возможностей всех правильных / неправильных / неверных индексов 1 и 1 и т. Д.?
Спасибо!
Ответ №1:
Вы можете получить все индексы следующим образом:
let diffIndex = zip(a1, a2).enumerated().filter {$1.0 != $1.1}.map {$0.offset}
Объяснение:
zip
создает последовательность парenumerated()
добавляет индекс к последовательностиfilter
сохраняет только пары с разными значениямиmap
собирает индекс и строит последовательность результатов.
Запуск этого на
let a1 = ["1", "2", "3", "4"]
let a2 = ["3", "2", "3", "5"]
Это создает последовательность [0, 3]
Ответ №2:
Попробуйте это
let a1 = ["1", "2", "3"]
let a2 = ["3", "2", "3"]
let result = zip(a1, a2).map({ $0 == $1 }).reduce(true, {$0 amp;amp; $1})
Ответ №3:
Используйте for
цикл:
for i in 0..<a1.length {
if a1[i] != a2[i] {
print("Index (i) is not the same")
}
}
Как правило, если вы обнаружите, что повторяете один и тот же код, но с разными номерами, вы можете заменить его for
циклом.
Комментарии:
1. Спасибо! Будет ли работать тот же цикл for, если значения будут строками, а не целыми числами?
2. @3Beard В этом цикле не делается никаких предположений о типах элементов
a1
иa2
, если!=
может быть применен оператор.
Ответ №4:
Конечно, вы могли бы сделать что-то подобное:
let a1 = ["1", "2", "3"]
let a2 = ["3", "2", "3"]
var compareResult : [String] = [String]()
if a1.count == a2.count { // Need to check they have same length
for count in 0..<a1.count {
let result : String = a1[count] == a2[count] ? "MATCH" : "MISMATCH"
compareResult.append(result)
}
print(compareResult)
// Do something more interesting with compare result...
}