【问题标题】:compare two lists to see what's missing比较两个列表以查看缺少的内容
【发布时间】:2019-05-27 22:57:23
【问题描述】:

如果我有两个列表,例如 list1 和 list2,我将如何搜索 list1 以查看是否有任何不在 list2 中的元素然后append it to list2。作为一个例子,这里有两个列表:

let list1 = ["James","John","fat","cart"]
var list2 = ["James","fat","bobby"]

因此在算法 list2 之后是:

["James","fat","bobby","John,"cart"]

【问题讨论】:

标签: swift


【解决方案1】:
for value in list1 {
  if !list2.contains(value) {
    list2.append(value)
  }
}

list1.forEach({ !list2.contains($0) ? list2.append($0) : nil })

list2.append(contentsOf: Set(list1).subtracting(Set(list2)))

使用foreach 循环遍历list1 中的项目。如果list2 不包含项目,则将其附加到list2。*

【讨论】:

    【解决方案2】:

    一行代码就可以搞定

    let list1 = ["James","John","fat","cart"]
    var list2 = ["James","fat","bobby"]
    
    list2.append(contentsOf: list1.filter{!list2.contains($0)})
    print("\list2")
    
    //output
    ["James", "fat", "bobby", "John", "cart"]
    

    【讨论】:

      【解决方案3】:

      到目前为止,大多数答案在大型阵列上的性能都很差。

      Array.contains(_:) 方法具有 O(n) 性能,这意味着组合 2 个数组将具有 O(n•m) 性能(其中 n 是一个数组中的项目数,m 是另一个数组中的项目数数组。)随着数组大小的增长,时间性能将呈指数级下降。

      如果您只需要处理少量物品,这没关系。但是如果数组中有 >= 数百个项目,时间性能会快速变差。

      更好地使用集合:

      let list1 = ["James","John","fat","cart"]
      var list2 = ["James","fat","bobby"]
      
      list2 = Array(Set(list1).union(Set(list2)))
      
      print(Set([list1, list2]))
      print(list2)
      

      集合使用哈希值进行包含/唯一性测试,该测试在 ≈ 常数时间内运行。

      Jorgandar 的答案也应该具有良好的时间性能,但我的答案更简单一些(我认为)更容易理解。

      我只是将每个数组转换为Set,将它们与Set.union(_:) 组合,然后将结果转换回一个集合。

      如果保留原始顺序很重要,那么您可以从每个数组构建集合以进行唯一性测试,然后使用集合循环遍历其中一个数组以判断是否需要将每个项目添加到另一个数组。这会稍微复杂一些,但应该会提供 ≈O(n) 性能保留数组排序。

      【讨论】:

        【解决方案4】:

        你需要像这样使用Set

        let list1 = ["James","John","fat","cart"]
        let list2 = ["James","fat","bobby"]
        
        let final = Array(Set([list1, list2].flatMap({$0})))
        

        或者

        let final = Array(Set(list1 + list2))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-22
          • 2018-03-08
          • 1970-01-01
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          • 2014-07-11
          • 2017-05-05
          相关资源
          最近更新 更多