【问题标题】:Contains or for-loop, what's more efficient?包含或for循环,哪个更有效?
【发布时间】:2017-03-11 16:05:45
【问题描述】:

使用 Swift,我有一个大约 30 个字符串的数组(每个字符串是一个单词)。我还有一个变量字符串,我想检查该字符串在数组中是否有匹配的值。

我的问题是,从效率的角度来看,我应该只使用:

if myArray.contains("MyString") {
    //Do stuff
}

或者我应该循环遍历它吗?

for i in 0..<myArray.count {
    if myArray[i] == "MyString" {
        //Do stuff
    }
}

【问题讨论】:

  • myArray.contains() 也枚举数组,但在给定元素第一次出现时停止。
  • 你应该问自己:这重要吗?这是否是应用程序的性能瓶颈?如果答案是“是”,则使用仪器并进行测量。如果答案是“否”,请选择您觉得更舒服的选项。
  • @MartinR 会的,谢谢!
  • 还有第三种方式:if myArray.index(of:"MyString") != nil
  • (再说一次,如果我们处理 30 个字符串,无论哪种方式,性能差异都可以忽略不计。)

标签: swift for-loop contains


【解决方案1】:

从效率的角度来看,使用myArray.contains("myString") 会更有效,因为它会在达到等于 "myString" 的值时停止,如果它确实存在于数组中的话。 for-loop 将继续遍历所有值,即使它找到了您指定的值,因此它的效率较低,但可能仅提供可忽略不计的效率升级,除非数组具有大量元素。

就像@vadian 所说,有第三种方式。还有第 4 种方法,使用 while-loop,您可以在使用 break 找到您搜索的值后停止(您也可以在 for-loop 中执行此操作),但是使用.contains(...) 更具可读性和简洁性,因此在我看来是最佳选择。

【讨论】:

  • 您也可以使用break 声明成功来停止for 循环。
【解决方案2】:

在这种情况下,代码可读性比性能更重要。除非您正在使用一个非常大的数组,否则 for 循环和包含的差异几乎不会引起注意。在我看来,您应该使用 contains。

【讨论】:

    【解决方案3】:

    如果你真的关心性能并且你有一个大的数据集,HashSet 或在 Swift 中,只需 Set 就会给你 O(1) 的查找时间来进行 contains 调用。因此,使用更好的数据结构将对性能产生巨大影响,而使用循环或包含函数的实现细节将是一个非因素。

    Set([1, 2, 3, 4, 5]).contains(3) //O(1) 
    
    [1, 2, 3, 4, 5].contains(3) //O(log n) assuming a binary search 
    

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2011-06-13
      • 2021-04-13
      • 2013-02-22
      • 2014-07-11
      • 2013-09-19
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多