如何通过与特定键的相似性对字符串数组进行排序

Dav*_*eek 4 arrays sorting string swift

鉴于以下内容:

var theArray: [String] = ["uncool", "chill", "nifty", "precooled", "dandy", "cool"]

我想根据单词与关键字的相似程度对数组进行排序.

var keyWord: String = "cool"

想要的结果是:

print// ["cool", "uncool", "precooled", ...]然后它就不再重要了.但are关键或contain it应该是第一个对象的话.

到目前为止,我最接近的尝试是:

let _theArray = entries.sorted { element1, element2 in

     return element1.contains(keyWord) && !element2.contains(keyWord)
}
Run Code Online (Sandbox Code Playgroud)

但这导致uncool成为第一项,那么precooled最相关的项目cool甚至会出现nifty.

我错过了什么?非常感谢帮助.

Leo*_*bus 12

您可以定义自己的相似性排序方法.请注意,我还添加了一个hasPrefix优先级,而不是仅包含关键字的那个,如果你不想要它,你可以删除它:

let theArray = ["uncool", "chill", "nifty", "precooled", "cooldaddy", "cool", "coolguy", "dandy"]
let key = "cool"

let sorted = theArray.sorted {
    if $0 == key && $1 != key {
        return true
    } 
    else if $0.hasPrefix(key) && !$1.hasPrefix(key)  {
        return true
    } 
    else if $0.hasPrefix(key) && $1.hasPrefix(key)
        && $0.count < $1.count  {
        return true
    } 
    else if $0.contains(key) && !$1.contains(key) {
        return true
    } 
    else if $0.contains(key) && $1.contains(key) 
        && $0.count < $1.count {
        return true
    }
    return false
}

print(sorted)   // ["cool", "coolguy", "cooldaddy", "uncool", "precooled", "chill", "nifty", "dandy"]
Run Code Online (Sandbox Code Playgroud)

  • 疯狂的完美解决方案。非常感谢你 (2认同)
  • @Jack不区分大小写(本地化)示例https://www.dropbox.com/s/eiml3zpxs45lp9t/Localized%20Case%20Insensitive%20Similarity%20Sort.zip?dl=1 (2认同)