Swift: определение введенных символов в порядке возрастания / убывания - PullRequest
0 голосов
/ 15 октября 2018

У меня есть текстовое поле, в котором я не могу установить текст в порядке возрастания / убывания.как "abcdefgh" или "1234567".как идентифицировать введенную строку не в порядке возрастания / убывания в swift.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Это должно сработать:

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
    }
}
0 голосов
/ 16 октября 2018

Другие предложили отсортировать строку и проверить, изменяется ли массив при сортировке.Это не совсем верно, поскольку строка «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) сложность времени.

0 голосов
/ 15 октября 2018

Вы можете сделать это следующим образом:

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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...