【问题标题】:Check if array contains part of a string in Swift?检查数组是否包含Swift中字符串的一部分?
【发布时间】:2015-08-29 22:33:05
【问题描述】:

我有一个包含许多字符串的数组。我使用contains()(见下文)来检查数组中是否存在某个字符串但是我想检查字符串的一部分是否在数组中?

itemsArray = ["Google, Goodbye, Go, Hello"]

searchToSearch = "go"

if contains(itemsArray, stringToSearch) {
    NSLog("Term Exists")
}
else {
    NSLog("Can't find term")
}

上面的代码只是检查一个值是否存在于整个数组中,但是我想找到"Google, Google and Go"

【问题讨论】:

    标签: arrays swift nsarray


    【解决方案1】:

    试试这样。

    let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
    let searchToSearch = "go"
    
    let filteredStrings = itemsArray.filter({(item: String) -> Bool in
    
         var stringMatch = item.lowercaseString.rangeOfString(searchToSearch.lowercaseString)
         return stringMatch != nil ? true : false
    })
    

    filteredStrings 将包含具有匹配子字符串的字符串列表。

    在 Swift 中,Array struct 提供了 filter 方法,它将根据过滤文本条件过滤提供的数组。

    【讨论】:

    • 谢谢。作为搜索的结果,我将如何明确检查数组中是否有任何内容?
    • 如果我正确理解了您的问题,您可以使用 count 检查结果数组过滤字符串中是否有任何内容。使用这个-filteredStrings.count
    • 在 Swift 4.0 中 rangeOfString 更改为 range(of: "string") 并且 lowercaseString 更改为 lowerCased()
    • 我在使用此解决方案时遇到了过滤时间问题。我有一个包含 1000 多个元素的 Type [Articles] 数组,我必须在该文章的描述中搜索,每篇文章的描述是 1500 多个单词。过滤花费了太多时间。大约 2-3 秒。
    【解决方案2】:

    首先,您已经定义了一个包含单个字符串的数组。 你可能想要的是

    let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
    

    然后您可以使用 contains(array, predicate)rangeOfString() - 可选地 .CaseInsensitiveSearch - 检查数组中的每个字符串 如果它包含搜索字符串:

    let itemExists = contains(itemsArray) {
        $0.rangeOfString(searchToSearch, options: .CaseInsensitiveSearch) !=  nil
    }
    
    println(itemExists) // true 
    

    或者,如果您想要一个包含匹配项的数组而不是是/否 结果:

    let matchingTerms = filter(itemsArray) {
        $0.rangeOfString(searchToSearch, options: .CaseInsensitiveSearch) !=  nil
    }
    
    println(matchingTerms) // [Google, Goodbye, Go]
    

    Swift 3 更新:

    let itemExists = itemsArray.contains(where: {
        $0.range(of: searchToSearch, options: .caseInsensitive) != nil
    })
    print(itemExists)
    
    let matchingTerms = itemsArray.filter({
        $0.range(of: searchToSearch, options: .caseInsensitive) != nil
    })
    print(matchingTerms)
    

    【讨论】:

    • 为什么containsthrow?是真还是假?
    • @Honey:您可以将抛出的闭包传递给 contains() 方法。如果闭包抛出一个错误,那么它会被 contains() 重新抛出。 – 比较stackoverflow.com/questions/43305051/…
    【解决方案3】:

    像这样试试。

    斯威夫特 3.0

    import UIKit
    
    let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
    
    var filterdItemsArray = [String]()
    
    
    func filterContentForSearchText(searchText: String) {
        filterdItemsArray = itemsArray.filter { item in
            return item.lowercased().contains(searchText.lowercased())
        }
    }
    
    filterContentForSearchText(searchText: "Go")
    print(filterdItemsArray)
    

    输出

    ["Google", "Goodbye", "Go"]
    

    【讨论】:

    • 请不要多次发布same answer。如果某个问题在其他地方已有答案,则将该问题标记为重复,而不是再次回答。谢谢。
    【解决方案4】:

    在 Swift 5 中具有更好的可读性:

    let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
    let searchString = "Googled"
    
    let result = itemsArray.contains(where: searchString.contains)
    print(result) //prints true in the above case.
    

    【讨论】:

      【解决方案5】:

      马克:- 斯威夫特 5,斯威夫特 4

      //MARK:- You will find the array when its filter in "filteredStrings" variable you can check it by count if count > 0 its means you have find the results
      
      let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
      let searchToSearch = "go"
      
      let filteredStrings = itemsArray.filter({(item: String) -> Bool in
      
          let stringMatch = item.lowercased().range(of: searchToSearch.lowercased())
          return stringMatch != nil ? true : false
      })
      print(filteredStrings)
      
      
      if (filteredStrings as NSArray).count > 0
      {
          //Record found
          //MARK:- You can also print the result and can do any kind of work with them
      }
      else
      {
          //Record Not found
      }
      

      【讨论】:

        【解决方案6】:
        func filterContentForSearchText(_ searchText: String) {
           filteredString = itemsArray.filter({( item : String) -> Bool in
                    return  item.lowercased().contains(searchText.lowercased())
            })
        }
        

        【讨论】:

          【解决方案7】:

          如果您只是检查某个项目是否存在于特定数组中,请尝试以下操作:

          var a = [1,2,3,4,5]
          
          if a.contains(4) {
              print("Yes, it does contain number 4")
          }
          else {
              print("No, it doesn't")
          }
          

          【讨论】:

            【解决方案8】:

            在 Swift 4 中:

                let itemsArray = ["Google", "Goodbye", "Go", "Hello"]
                let searchString = "Go"
                let filterArray = itemsArray.filter({ { $0.range(of: searchString, options: .caseInsensitive) != nil}
                })
                print(filterArray)
            

            【讨论】:

              【解决方案9】:

              我最近遇到了同样的问题,不喜欢这些答案中的大多数, 像这样解决它:

              let keywords = ["doctor", "hospital"] //your array
              
              func keywordsContain(text: String) -> Bool { // text: your search text
                  return keywords.contains { (key) -> Bool in
                      key.lowercased().contains(text.lowercased())
                  }
              }
              

              这也将正确触发诸如“doc”之类的搜索,上述许多答案都没有,这是最佳实践。 contains() 比 first() 更高效!= nil 来源:https://www.avanderlee.com/swift/performance-collections/

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-09-19
                • 2017-01-18
                • 1970-01-01
                • 1970-01-01
                • 2021-06-10
                • 2022-06-30
                • 2021-12-14
                • 2016-01-25
                相关资源
                最近更新 更多