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)
我的排序算法有问题。
我的 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)