簡體   English   中英

迅速排序NSArray

[英]Swift sort NSArray

我的排序算法有問題。

我的NSArray (在這里vcd.signals.key )包含Strings的值,例如:

"x [0]", "x [18]", "x [15]", "x [1]"...

當我嘗試對結果進行排序時

"x [0]", "x [15]", "x [18]", "x [1]" 

代替:

"x [0]", "x [1]", "x [15]", "x [18]"

這是我的代碼:

let sortedKeys = sorted(vcd.signals.keys) {
    var val1 = $0 as! String
    var val2 = $1 as! String

    return val1 < val2
 }

您知道如何解決此問題嗎?

您的問題與您的比較有關,例如,比較以下兩個字符串時會發生什么:

println("x [15]" < "x [1]") // true

這是因為默認詞典編輯比較器逐個字符地逐個字符地進行比較,當然位置3中的5小於位置3中的]

println("5" < "]") // true

對於上面解釋的內容,您需要創建自己的比較器,但是,只需要比較[$0]的數字即可。 為此,我使用正則表達式匹配方括號內的任何數字,如下所示:

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    let regex = NSRegularExpression(pattern: regex,
        options: nil, error: nil)!
    let nsString = text as NSString
    let results = regex.matchesInString(text,
        options: nil, range: NSMakeRange(0, nsString.length))
        as! [NSTextCheckingResult]
    return map(results) { nsString.substringWithRange($0.range)}
}

var keysSorted = keys.sorted() {

        var key1 = $0
        var key2 = $1

        var pattern  = "([0-9]+)"   
        var m1 = self.matchesForRegexInText(pattern, text: key1)
        var m2 = self.matchesForRegexInText(pattern, text: key2)

        return  m1[0] < m2[0]
}

在上面的正則表達式中,我假設數字僅出現在方括號內,並且與String內的任何數字匹配,但是如果您想實現更多功能,可以隨時更改正則表達式。 然后,您將達到以下目的:

println(keysSorted) // [x [0], x [1], x [15], x [18]]

希望對您有所幫助。

您遇到的問題是大括號字符']'出現在數字后面。 這意味着“ 18”小於“ 1]”。 只要您所有的字符串都共享“ [digits]”的形式,就可以刪除右括號,對字符串進行排序,然后將右括號重新添加到最終數組中。 以下代碼適用於Swift 2:

let arr = ["x [0]", "x [18]", "x [15]", "x [1]"]
let sorted = arr.map { $0.substringToIndex($0.endIndex.predecessor()) }.sort().map { $0 + "]" }

print(sorted)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM