【问题标题】:Sort alphanumeric array, consecutive numbers should reside at last排序字母数字数组,连续的数字应位于最后
【发布时间】:2016-08-25 07:42:58
【问题描述】:

我想对字母数字进行排序,但数字应该放在末尾而不是开头。比如

let array = ["1", "a", "b", "z", "3", "!"]
let sortedArray = array.sort { (firstObject, secondObject) -> Bool in
    firstObject < secondObject
}

输出:

[“!”,“1”,“3”,“a”,“b”,“z”]

所需输出:

[“a”、“b”、“z”、“1”、“3”、“!”]

提前致谢。

【问题讨论】:

  • 所以?你为什么不试着做到这一点呢?显然firstObject &lt; secondObject 不适合您的用例。您可能需要更复杂地比较这些字符代码。你试过吗?
  • 这里的排序规则是什么?为什么 ”!”是排序数组的结尾吗?
  • 如果您想要的结果与常见的排序约定不同,这个任务应该有自定义的解决方案(因为感叹号在最后,以及字母字符后面的数字)。
  • "!" 不是字母数字。如果 then 数组可以包含任意字符,ä € ~ π ???? ???????? β ☼ ∬ 应该在哪里排序?

标签: ios arrays swift sorting


【解决方案1】:

这里有一个适合您情况的解决方案:

预期结果是:

  • 字母优先;
  • 然后是数字;
  • 然后是其他人;

这是一种方法。

// Works with both arrays
var array = ["1", "b", "a", "z", "3", "!"]
//var array = ["1", "b", "A", "Z", "3", "!"]

func isLetter(char: String) -> Bool {
    return ("a"..."z").contains(char) || ("A"..."Z").contains(char)
}

func isNumber(char: String) -> Bool {
    return Int(char) != nil
}

let letters = array.filter(isLetter).sort{$0.lowercaseString < $1.lowercaseString}
let numbers = array.filter(isNumber).sort{Int($0) < Int($1)}
let others = Array(Set(array).subtract(letters).subtract(numbers)).sort{$0 < $1}

let sortedArray = letters + numbers + others

第一个数组是

["a", "b", "z", "1", "3", "!"]

第二个是

["A", "b", "Z", "1", "3", "!"]

它做你想做的事。包括单元测试并将其包装在一个方法中,你就可以开始了。 Buuuut,一点也不“干净”。

【讨论】:

    【解决方案2】:

    假设您想收到“数字应该在结尾而不是开头”,而不是用意外的“!”观看您的示例排序。然后你可以这样做:

    let array = ["1", "a", "b", "z", "3", "!"]
    let sortedArray = array.sort { (firstObject, secondObject) -> Bool in
        let firstIsNumber = firstObject.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet())?.count > 0
        let secondIsNumber = secondObject.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet())?.count > 0
        if firstIsNumber != secondIsNumber {return secondIsNumber}
        return firstObject < secondObject
    }
    print(sortedArray)
    //["!", "a", "b", "z", "1", "3"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2019-11-13
      • 2016-08-27
      相关资源
      最近更新 更多