在Swift中,如何对字符串数组进行排序,并且数字,符号等字符串总是在字母字符串之后?

时间:2015-11-03 20:37:34

标签: swift

我想对字符串数组进行排序,以便字母字符总是在任何其他类型的字符之前。例如:

["800", "word", "test"]

应排序:

["test", "word", "800"]

字母字符串中可以包含数字,但不能将它们作为第一个字母。所以,例如,如果它仍然是“狗”之前的“ab8s”。

我该怎么做?默认情况下,Swift中的比较运算符在字母之前对数字进行排序。

3 个答案:

答案 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(<)
}

enter image description here

答案 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))

Console output

上面的方法按升序对String进行排序,如果要执行另一种方法,只需更改行即可

        return s1 < s2

        return s1 > s2