【问题标题】:Compare an array with another & then return the index of matched results将一个数组与另一个数组进行比较,然后返回匹配结果的索引
【发布时间】:2020-01-27 20:09:14
【问题描述】:

对不起,如果这是一个愚蠢的问题,但我尝试的一切似乎都是错误的! (我是 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] 

我缺少一个简单的功能吗?!提前感谢您的帮助。

【问题讨论】:

  • let result = array2.map({ array1.firstIndex($0) ?? -1 })let result2 = array2.compactMap({ array1.firstIndex(of: $0) }) ?缺少案例:如果您在 array1 中有两次 "ghi" 会发生什么?如果array1 中没有"ghi" 会怎样?
  • 感谢您的帮助朋友 - 在这种情况下,数组 1 中的值将始终是唯一的。不过,您的第二点确实提出了一个问题....我想在某些情况下,数组 2 可能是 ["ghi", "xyz", "uhr", "zzz"] - 在这种情况下,"zzz" 不是存在于数组 1 中,理想情况下我需要忽略它....
  • 那么 compactMap 和 firstIndex(of:) 应该可以正常工作
  • result2 是使用带有闭包的“基本”方法的“最短”方法。但是,如果您是作为开发人员(而不仅仅是 Swift)开始的,那么为自己编写一个手册 for 或 foreach 循环以获取一些基本算法是没有问题的。

标签: arrays swift indexing compare


【解决方案1】:
var indexArr: [Int] = []

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

print(indexArr)

【讨论】:

  • 我最终选择了这个,但公平地说,它们都有效!谢谢大家:)
【解决方案2】:
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)

【讨论】:

    【解决方案3】:

    要获得有效的解决方案,您可以先创建一个索引。索引将第一个数组中的每个元素映射到它在数组中的位置。两个数组都只遍历一次:

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

    第二个参数是一个闭包,它控制在重复键的情况下将哪个值放入字典中。这里我们选择一个元素在数组中第一次出现的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2021-05-17
      • 2016-07-06
      相关资源
      最近更新 更多