我想对字符串数组进行排序,以便字母字符总是在任何其他类型的字符之前。例如:
["800", "word", "test"]
应排序:
["test", "word", "800"]
字母字符串中可以包含数字,但不能将它们作为第一个字母。所以,例如,如果它仍然是“狗”之前的“ab8s”。
我该怎么做?默认情况下,Swift中的比较运算符在字母之前对数字进行排序。
答案 0 :(得分:2)
这个怎么样。
func sortedNumbersLast(words: [String]) -> [String] {
var startsWithDigit = [String]()
var startsWithCharacter = [String]()
for word in words {
if let first = word.characters.first {
if first >= "0" && first <= "9" {
startsWithDigit.append(word)
}
else {
startsWithCharacter.append(word)
}
}
}
return startsWithCharacter.sort(<) + startsWithDigit.sort(<)
}
答案 1 :(得分:2)
关键是要写下你的“先前订购”功能,无论你想做什么。例如,如果用数字表示“0”......“9”,那么这样的东西可能就是你想要的东西:
func isDigit(c: Character) -> Bool {
return "0" <= c && c <= "9"
}
func sortedLettersFirst(lhs: String, rhs: String) -> Bool {
for (lc, rc) in zip(lhs.characters, rhs.characters) {
if lc == rc { continue }
if isDigit(lc) && !isDigit(rc) {
return false
}
if !isDigit(lc) && isDigit(rc) {
return true
}
return lc < rc
}
return lhs.characters.count < rhs.characters.count
}
words.sort(sortedLettersFirst)
当然,如果“数字”表示“unicode数字”,请参阅What is the replacement for isDigit() for characters in Swift?了解isDigit
的其他方法。但最终,重点是在isOrderedBefore
函数中制定您想要的任何规则,并将其传递给sort()
。
答案 2 :(得分:0)
在Playground中尝试一下,正如您在控制台输出中看到的那样,它可以完成工作,将字母放在最前面,然后将数字和其他符号放在结尾。
let stringsSortedByLettersFirstNumbersThenAndOtherSymbolsAtTheEnd: (String, String) -> Bool = { s1, s2 -> Bool in
guard let f1 = s1.first, let f2 = s2.first else {
return s1 < s2
}
if f1.isLetter == false && f2.isLetter {
return false
}
if f1.isLetter && f2.isLetter == false {
return true
}
if f1.isNumber == false && f2.isNumber {
return false
}
if f1.isNumber && f2.isNumber == false {
return true
}
return s1 < s2
}
let str = ["4", "A", "B", "Z", "T", "3", "'", "8"]
print(str.sorted(by: stringsSortedByLettersFirstNumbersThenAndOtherSymbolsAtTheEnd))
上面的方法按升序对String进行排序,如果要执行另一种方法,只需更改行即可
return s1 < s2
到
return s1 > s2