Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 搜索作为搜索字符串前缀的最长字符串的数组_Swift_String_Search_Startswith - Fatal编程技术网

Swift 搜索作为搜索字符串前缀的最长字符串的数组

Swift 搜索作为搜索字符串前缀的最长字符串的数组,swift,string,search,startswith,Swift,String,Search,Startswith,我是一个新的Swift开发者。我使用的是Swift 4.2和Xcode 10.2 我想在数组中搜索一个与搜索字符串相比字符最多的结果。更具体地说,我需要数组中最长的字符串,它是搜索字符串的前缀 例如,如果我的数组是: let array = ["1", "13", "1410", "1649", "1670"] 我的搜索字符串是: let searchString = "16493884777" 我希望结果是“1649” 我找不到另一个可以快速解决的SO问题。您可以从末尾迭代前缀数组(假设前

我是一个新的Swift开发者。我使用的是Swift 4.2和Xcode 10.2

我想在数组中搜索一个与搜索字符串相比字符最多的结果。更具体地说,我需要数组中最长的字符串,它是搜索字符串的前缀

例如,如果我的数组是:

let array = ["1", "13", "1410", "1649", "1670"]
我的搜索字符串是:

let searchString = "16493884777"
我希望结果是
“1649”


我找不到另一个可以快速解决的SO问题。

您可以从末尾迭代前缀数组(假设前缀数组已排序),如果找到匹配项,则立即返回,因为该前缀将保证是最长的,因为无法存在另一个相同长度的匹配前缀:

import Foundation

func longestMatchingPrefix(_ prefixArray: [String], _ searchString: String) -> String {
    for p in prefixArray.reversed() {
        if searchString.hasPrefix(p) {
           return p
        }
    }
    return "No matching prefix found"
}

print(longestMatchingPrefix(["1", "13", "1410", "1649", "1670"], "16493884777"))
输出:

1649

您是在查找与搜索字符串具有最多共同字符的条目,还是查找具有最长共同前缀的条目?换句话说:
xxx16493884777
是否符合最佳结果?很抱歉,不够清晰。最长的通用前缀是我需要的。数组将包含唯一的字符串。xxx16493884777不能作为最佳结果。谢谢。这是一个优雅的解决方案。我正在用我的大数组进行测试,但它在操场上运行得很好。
longestMatchingPrefix([“1”、“13”、“1410”、“1649”、“1670”]、“164”)
返回“1”而不是“1649”——这是预期的结果吗?是的。这是正确的。因为searchString 164没有9,所以我不想使用该结果。同样,如果我搜索“1200”,我希望返回“1”。@TMLynch:那么您不是在寻找具有最长公共前缀的字符串,而是在寻找作为搜索字符串前缀的最长字符串?也许您应该澄清您的问题(为了本问答的未来读者)。请注意,此解决方案可以简化为
prefixArray.reversed()。首先(其中:searchString.hasPrefix)