Swift 对 NSArray 进行排序

Swift sort NSArray

我的排序算法有问题。

我的 NSArray(此处 vcd.signals.key)包含字符串值,例如:

"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 = [=14=] as! String
    var val2 =  as! String

    return val1 < val2
 }

知道如何解决这个问题吗?

您的问题与您的比较有关,例如,当您比较以下两个字符串时,看看会发生什么:

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

这是因为默认的词典编纂比较器是逐个字符、逐个位置比较的,当然位置 3 中的 5 小于位置 3 中的 ]

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

对于上面的解释,您需要创建自己的比较器,但是,只比较 [[=16=]] 中的数字。为此,我使用正则表达式来匹配括号内的任何数字,如下所示:

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([=12=].range)}
}

var keysSorted = keys.sorted() {

        var key1 = [=12=]
        var key2 = 

        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 { [=10=].substringToIndex([=10=].endIndex.predecessor()) }.sort().map { [=10=] + "]" }

print(sorted)