迅捷:确定输入的字符按升序/降序

时间:2018-10-15 19:47:41

标签: swift

我有一个文本字段,在其中无法设置升序/降序的文本。例如"abcdefgh""1234567"。如何快速识别输入的字符串不是按升序/降序排列。

3 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

enum Order {
    case ascending
    case descending
    case none
}

func getOrder(of text: String) -> Order {
    switch text {
    case String(text.sorted()):
        return .ascending
    case String(text.sorted().reversed()):
        return .descending
    default:
        return .none
    }
}

答案 1 :(得分:2)

其他人建议对字符串进行排序,并检查数组是否随着排序而改变。这不太正确,因为字符串“ abcxyz”是按排序顺序排列的,但不是序列,因为它缺少一些字符。排序也相对昂贵,至少在较大的数组上是如此。 (如果要处理数百个字符,这不是问题,因为对于小数据集,好的排序算法的O(n•log n)性能几乎是O(n)性能。)

我想到的String扩展名如何?

extension String {
    func isSequence() -> Bool
    {
        let charValues = Array(self.unicodeScalars).map { $0.value }
        guard let first = charValues.first,
            let last = charValues.last else { return false }

        return charValues == Array(first...last)
    }
}

它将字符串映射到UTF32值数组中,然后检查结果是否与值first...last的范围相同。

您可以使用该功能来验证用户的文本输入,以查看其是否是诸如abcdefg之类的连续字符序列。

以上内容应具有O(n)的时间复杂度。

答案 2 :(得分:1)

您可以这样操作:

func isOrderedSequence(_ string: String) -> Bool {
    return string == String(string.sorted())
}

以下是一些测试用例:

isOrderedSequence("1234567")  //true
isOrderedSequence("7836")     //false
isOrderedSequence("abcdefg")  //true
isOrderedSequence("Hello")    //false
isOrderedSequence("123abc")   //true

它使用sorted()