Сравните массив с другим и затем верните индекс совпадающих результатов - PullRequest
0 голосов
/ 27 сентября 2019

Извините, если это глупый вопрос, но все, что я пытаюсь сделать, кажется неправильным!(Я новичок в Swift).

У меня есть 2 массива строк, которые мне нужно сравнить для совпадений, а затем вернуть массив с индексной позицией этих совпадений .... IE:

let array1 = ["abc", "def", "ghi", "jkl", "xyz", "uhr"]
let array2 = ["ghi", "xyz", "uhr"]

// Search array1 for instances of array2

// Result I want is: [2, 4, 5] 

Есть ли простая функция, которую мне не хватает ?!Заранее спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 27 сентября 2019
var results: [Int] = []

for i in 0..<array1.count {
   for j in 0..<array2.count {
      if array1[i] == array2[j] {
         results.append(i)
      }
   }
}

print(results)
1 голос
/ 27 сентября 2019

Для эффективного решения вы можете сначала создать index .Индекс отображает каждый элемент в первом массиве на его позицию в массиве.Оба массива просматриваются только один раз:

let array1 = ["abc", "def", "ghi", "jkl", "xyz", "uhr"]
let array2 = ["ghi", "xyz", "uhr"]

let index = Dictionary(uniqueKeysWithValues: array1.enumerated().map {
    ($0.element, $0.offset)
})
let result = array2.compactMap { index[$0] }
print(result) // [2, 4, 5]

Если элементы в array1 не известны как уникальные, тогда индекс должен вычисляться немного по-разному:

let index = Dictionary(array1.enumerated().map { ($0.element, $0.offset) },
                       uniquingKeysWith: { (first, _) in first })

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

1 голос
/ 27 сентября 2019
var indexArr: [Int] = []

for element in array2 {
    if let elementIndex = array1.firstIndex(of: element) {
       indexArr.append(elementIndex)
    }
}

print(indexArr)
...