Как проверить, отсортирован ли массив строк в алфавитном порядке или нет с помощью Kotlin?

Привет, я изучаю Kotlin самостоятельно, и я с трудом придумываю решение этой проблемы в своем учебном материале.

Мне дается список строк, и мне нужно посмотреть, находятся ли они в алфавитном порядке. Я знаю, что мне нужно использовать цикл for и проверять первый символ каждой строки, но я не знаю, как продвигаться оттуда?

for (item in array) println(item[0]) 

Например ["adam","ben","chloe"] означает, что я должен распечатать «Строки в алфавитном порядке».

А также для ["ben","adam", "chloe"] Я должен распечатать «Строки не в алфавитном порядке».

Вот один лайнер:

 val a = listOf("a", "b", "c") a.zip(a.drop(1)).all { (a, b) -> a <= b } // true 

Объяснение:

a.zip(a.drop(1)) возвращает пары соседних элементов. Если в каждой паре первый элемент меньше или равен следующему, массив находится в порядке.

Если вы хотите повысить производительность, сначала вы можете обернуть массив в ленивой последовательности. В этом случае массив не будет скопирован:

 a.asSequence().let { it.zip(it.drop(1)).all { (a, b) -> a < b } } 

Все это O(N) (однопроходный массив), что является оптимальным для этой задачи.

Я уверен, что вы могли бы выполнить свою желаемую задачу полностью, используя цикл for.

Однако в Котлин я лично считаю, что было бы более идиоматично делать что-то подобное, пока :

 fun isAlphabetical(stringsArray: Array<String>): Boolean { if (stringsArray.size < 2) return true return (1 until stringsArray.size).none { stringsArray[it] <= stringsArray[it - 1] } } fun main(args: Array<String>) { val testCases = arrayOf(arrayOf("adam", "ben", "chloe"), arrayOf("ben", "adam", "chloe")) for(testCase : Array<String> in testCases){ println("The strings are: ${testCase.joinToString()}") if (isAlphabetical(testCase)) { println("Strings are in alphabetical order.\n") } else { println("Strings are not in alphabetical order.\n") } } } 

Вывод:

 The strings are: adam, ben, chloe Strings are in alphabetical order. The strings are: ben, adam, chloe Strings are not in alphabetical order. 

В основном вы сравниваете только каждый элемент массива с предыдущим элементом (используя <= ), если длина массива больше 1 .

Очень простой и простой способ выполнить это путем сортировки и сравнения исходного списка с отсортированным (два списка равны, если они имеют одинаковые элементы в одном порядке). Поскольку вы упомянули, что имеете дело с массивом, сначала нужно преобразовать его в список. Это решение не самое лучшее с точки зрения производительности (это O(n log n) и дважды преобразовывает массив в список), но это очень читаемо:

 val test = array.asList() == array.asList().sorted() 

Полный код для вашего вопроса может быть:

 println(if (array.asList() == array.asList().sorted()) "Strings are in alphabetical order." else "Strings are not in alphabetical order.") 

Другое решение:

 val list = listOf("a", "b", "c") list.windowed(2).none { (a, b) -> a > b } // true 

Еще одно решение 🙂

 data class Result(val isInOrder: Boolean, val lastString: String) { val toString = when { isInOrder -> "Strings are in alphabetical order." else -> "Strings are not in alphabetical order." } } fun Array<String>.isInAlphabeticalOrder() = this.fold(Result(true, ""), { acc, word -> Result(acc.isInOrder && acc.lastString < word, word) }) fun main(args: Array<String>) { val test1 = arrayOf("adam", "ben", "chloe") val test2 = arrayOf("ben", "adam", "chloe") println(test1.isInAlphabeticalOrder().toString) println(test2.isInAlphabeticalOrder().toString) } 
Intereting Posts