【问题标题】:Swift sort NSArray快速排序 NSArray
【发布时间】:2015-08-13 14:45:31
【问题描述】:

我的排序算法有问题。

我的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 = $0 as! String
    var val2 = $1 as! String

    return val1 < val2
 }

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

【问题讨论】:

  • 你的x[0], x[18], x[15],...String一个吗?
  • 是的,每个都是字符串
  • 字符串在哪里?你能在实际的字符串周围加上引号吗?

标签: ios swift sorting nsarray


【解决方案1】:

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

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]]

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    您遇到的问题是右大括号字符“]”出现在数字之后。这意味着“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)
    

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 2016-11-29
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      相关资源
      最近更新 更多