如何检查一个字符串数组是否按字母顺序排序或不使用Kotlin?

我给了一个字符串列表,我需要看看它们是否按字母顺序排列。

我知道我需要使用for循环,并检查每个字符串的第一个字符,但我不知道如何从那里进步。

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

例如["adam", "ben", "chloe"]应该返回true

同样对于["ben", "adam", "chloe"]应该返回false

这里是一个class轮:

 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循环完成你想要的任务。

但是,在Kotlin中,我个人认为使用这样的方法会比较习惯:

 fun isAlphabetical(stringsArray: Array): Boolean { if (stringsArray.size < 2) return true return (1 until stringsArray.size).none { stringsArray[it] <= stringsArray[it - 1] } } fun main(args: Array) { val testCases = arrayOf(arrayOf("adam", "ben", "chloe"), arrayOf("ben", "adam", "chloe")) for(testCase : Array 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 

你可以使用一个简单的一行:

 array.zipWithNext { s1, s2 -> s1 <= s2 }.all { it } 

又一个解决方案:)

 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.isInAlphabeticalOrder() = this.fold(Result(true, ""), { acc, word -> Result(acc.isInOrder && acc.lastString < word, word) }) fun main(args: Array) { val test1 = arrayOf("adam", "ben", "chloe") val test2 = arrayOf("ben", "adam", "chloe") println(test1.isInAlphabeticalOrder().toString) println(test2.isInAlphabeticalOrder().toString) }